编程工作中写博文纯属记录自己的问题,不喜勿碰。
由于本人语言组织能力比较差,所以阅读到本文的朋友将就着看。
近期工作中涉及到了xml文件的对比以此来判断我方录入的数据和最后的计算结果是否正确。我方系统用freemark来生成xml所以节点的顺序完全可以自己定,但是往往事与愿违,客户提供的标准xml文件节点顺序也不能保证每次节点顺序都是一样的。所以自己写了个程序来重新组装xml文件。
先上效果图更容易理解:
没排序之前可能是这样:右边是standerdXml,左边是selfXml
重组之后:左边是newMml右边是standerXml
下面结合代码记录自己的实习思路:
xml文件分为三种:
-
客户提供的xml文件,下文以 standardXml 代替;
-
我方生成的xml文件,下文以 selfXml 代替;
-
程序生成并写入文件系统的xml文件,下文以 newXml代替。
配置信息,主要是standardXml 和 selfXml 所在的文件夹和xml里面的名称空间
static final String standardForderPath = "D:\\stand"; //standardXml 文件所在文件夹 static final String selfForderPath = "D:\\self"; //selfXml 文件所在文件夹 static final String[] namespaceForPrefix = {"xsi","HIP","SAP","SAP09","CS"}; //用到的所有名称空间
既然要重组,首先要对比,从standardXml的根节点开始取Element,然后用xPath去selfXml文件中看是否也存在这个节点,如果存在这把这个节点从selfXml的所有信息(属性,值等)取出来放到newXml中依次类推,这样一份和standardXml节点顺序一样的xml文件就出来了。
两个文件夹中的xml放到两个集合中,然后通过下面这个方法取出同名的两份放到数组中返回。
/** * 每次提供两份xml文件用于对比 * xmls[0]为标准文件夹中取的xml, * xmls[1]为待对比的xml文件。 */ public File[] provideXML(List<File> standaredList,List<File> selfsList){ File[] xmls = new File[2]; for(File standaredXML : standaredList){ String tempName = standaredXML.getName(); int findNum = 0; for(int i = 0; i < selfsList.size(); i++){ if(tempName.equals(selfsList.get(i).getName())){ File selfXML = selfsList.get(i); xmls[0] = standaredXML; xmls[1] = selfXML; standaredList.remove(standaredXML); selfsList.remove(selfXML); findNum++; return xmls; } } if(findNum == 0){ standaredList.remove(standaredXML); return null; } } return null; }
下面这个方法算是核心,进行element重组:
public HashMap<Integer, Object> loopAndCreateXml(HashMap<Integer, Object> map){ if(newDoc == null){ newDoc = this.createDocument(); } Element standerdXmlElement = (Element) map.get(1); xpathSelector = DocumentHelper.createXPath(standerdXmlElement.getUniquePath()); Element e = (Element)xpathSelector.selectSingleNode(((Document) map.get(2))); if(e != null){ System.out.println("提取的节点名称:" + e.getQualifiedName()); if(e.getParent() != null){ xpathSelector = DocumentHelper.createXPath(e.getParent().getUniquePath()); fatherElement = (Element)xpathSelector.selectSingleNode(newDoc); } if(fatherElement == null){ fatherElement = newDoc.addElement(e.getQualifiedName(), e.getNamespaceURI()); fatherElement.setAttributes(e.attributes()); String spaceUri = ""; Element rootElt = ((Document) map.get(2)).getRootElement();//获取根节点 String defNamespace = rootElt.getNamespaceURI(); //处理名称空间 if(defNamespace != null) { nameSpaceMap.put("defu", defNamespace); } for(String nameSpace : Paths.namespaceForPrefix){ spaceUri = rootElt.getNamespaceForPrefix(nameSpace) != null ? rootElt.getNamespaceForPrefix(nameSpace).getURI() : null; if(spaceUri != null){ nameSpaceMap.put(nameSpace, spaceUri); fatherElement.addNamespace(nameSpace, spaceUri); } } }else{ fatherElement = fatherElement.addElement(e.getQualifiedName(), e.getNamespaceURI()); fatherElement.setText(e.getText()); fatherElement.setAttributes(e.attributes()); } }
源码已经上传,想了解的朋友可以去下源码。无论代码写的怎样,总之还是给我的工作带来了便利,也只有这样我才能真正体验到编程的乐趣。
企-鹅-群:105901697(电脑爱好者),112456134(任务群)欢迎加入
相关推荐
XSLT则用于转换XML文档,实现格式化或内容的重组。 此外,XML还与.NET框架中的其他技术有密切联系,如LINQ to XML(Language Integrated Query for XML)。这是一种更高效、更直观的方式来处理XML数据,它将查询XML...
11. **XSLT(Extensible Stylesheet Language Transformations)**:转换XML文档为其他格式,如HTML或PDF,或者进行数据的处理和重组。 12. **XML的应用**:举例说明XML在Web服务、配置文件、数据库交换、电子邮件...
5. XSLT:XSL Transformations用于转换XML文档,可以将XML数据转换为HTML、PDF或其他格式,或者进行数据重组。 6. Namespaces:XML命名空间用于避免元素和属性名的冲突,通过使用URI(Uniform Resource Identifier...
6. **XSLT(Extensible Stylesheet Language Transformations)**:XSLT用于转换XML文档,可以将XML数据转换成其他格式,如HTML、PDF,或者进行数据重组。 7. **DOM(Document Object Model)**:DOM是XML和HTML...
首先,你需要导入DOM4J库并解析XML文档为Document对象,然后通过XPath表达式找到需要的节点,最后进行转换操作。以下是一个简单的示例: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; ...
XSLT使用样式表定义转换规则,将XML文档转换成HTML、PDF或其他格式的文档,或者进行数据提取和重组。 XPath(XML Path Language)是用于在XML文档中查找信息的语言。它提供了一种简洁的方式来选取XML节点,如元素、...
5. **版本兼容性**:不同的Android版本可能对XML文件有不同的解析规则,反编译时需注意目标设备的Android版本,以确保反编译后的XML能正常工作。 在处理“ArrayIndexOutBoundsException”这类问题时,首先应尝试...
解析器将XML文档分解为元素树,方便我们访问和处理数据。 2. 数据提取:解析后,我们可以遍历XML元素树,根据需要提取特定的数据节点。这可能涉及到递归函数,以处理嵌套的XML结构。确保正确处理属性和文本内容是...
XPath是查询XML文档的强大工具,可以快速定位节点,而XSLT(eXtensible Stylesheet Language Transformations)则用于转换XML文档,实现数据的重组和格式化。此外,XQuery是另一种用于查询XML数据的语言,功能更为...
此外,XPath是XML的一个查询语言,用于选取XML文档中的节点,而XSLT(Extensible Stylesheet Language Transformations)则用于转换XML文档,实现数据的重组和格式化。 在实际应用中,XML常用于Web服务,如SOAP...
XML数据类型不仅可以存储完整的XML文档,还可以与其他关系数据一起使用,从而实现灵活的数据建模。 首先,XML数据类型的列可以在一个包含其他关系列的表中创建,这种做法适用于那些主要依赖于非XML数据的应用程序,...
4. **XSLT**:通过XSLT,开发者可以将XML文档转换成其他格式,如HTML或PDF,或者进行数据的重组和过滤。 5. **XML在Web应用程序中的应用**:讨论如何将XML用于Ajax(Asynchronous JavaScript and XML)技术,实现...
2. 强大的转换能力:XSLT提供了丰富的功能,可以进行复杂的数据重组和格式化。 3. 可读性:XML和XSLT都是人类可读的格式,便于理解和调试。 4. 标准化:两者都是W3C标准,具有广泛的支持和成熟的库。 在开发过程中...
XSLT的核心概念包括模板、模式匹配和变量,使得XML数据可以根据需求进行灵活的格式化和重组。 在学习XML时,了解基本语法和元素的嵌套是关键。XML文档由根元素开始,包含一系列嵌套的元素,每个元素都有开始标签和...
这包括创建和解析命名空间,编写XPath表达式来定位和提取数据,设计XSLT样式表进行数据转换,利用DOM和SAX解析XML文档,以及制定XML Schema来验证文档的结构和内容。通过这些高级技术的学习,你将能够更高效地处理...
DOM模型使得编程语言能够动态地与XML文档交互,对数据进行增删改查。 ### 5. SAX(Simple API for XML):事件驱动的解析器 SAX是一种轻量级的、基于事件的XML解析器。与DOM不同,SAX不需要一次性加载整个文档到...
XML以其独特的自描述特性,允许程序根据其内容对数据进行解析、过滤和重组等操作,极大地提升了数据的可处理性和灵活性。然而,为了充分利用XML的强大功能,开发出能够有效处理存储在XML文档中的数据的高级查询引擎...