编程工作中写博文纯属记录自己的问题,不喜勿碰。
由于本人语言组织能力比较差,所以阅读到本文的朋友将就着看。
近期工作中涉及到了xml文件的对比以此来判断我方录入的数据和最后的计算结果是否正确。我方系统用freemark来生成xml所以节点的顺序完全可以自己定,但是往往事与愿违,客户提供的标准xml文件节点顺序也不能保证每次节点顺序都是一样的。所以自己写了个程序来重新组装xml文件。
先上效果图更容易理解:
没排序之前可能是这样:右边是standerdXml,左边是selfXml
重组之后:左边是newMml右边是standerXml
下面结合代码记录自己的实习思路:
xml文件分为三种:
配置信息,主要是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()); } }
源码已经上传,想了解的朋友可以去下源码。无论代码写的怎样,总之还是给我的工作带来了便利,也只有这样我才能真正体验到编程的乐趣。
QQ群:105901697(电脑爱好者),112456134(任务群)欢迎加入
本文出自 “Thinking-Programming” 博客,请务必保留此出处http://zp1990.blog.51cto.com/2267648/1289516