对xml文档进行重组

前端之家收集整理的这篇文章主要介绍了对xml文档进行重组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

编程工作中写博文纯属记录自己的问题,不喜勿碰。

由于本人语言组织能力比较差,所以阅读到本文的朋友将就着看。


近期工作中涉及到了xml文件的对比以此来判断我方录入的数据和最后的计算结果是否正确。我方系统用freemark来生成xml所以节点的顺序完全可以自己定,但是往往事与愿违,客户提供的标准xml文件节点顺序也不能保证每次节点顺序都是一样的。所以自己写了个程序来重新组装xml文件


先上效果图更容易理解:

没排序之前可能是这样:右边是standerdXml,左边是selfXml

重组之后:左边是newMml右边是standerXml

下面结合代码记录自己的实习思路:

xml文件分为三种:

    1. 客户提供的xml文件,下文以 standardXml 代替;

    2. 我方生成的xml文件,下文以 selfXml 代替;

    3. 程序生成并写入文件系统的xml文件,下文以 newXml代替。


    配置信息,主要是standardXml selfXml 所在的文件夹和xml里面的名称空间

    1. static final String standardForderPath = "D:\\stand";
    2. //standardXml 文件所在文件
    3. static final String selfForderPath = "D:\\self";
    4. //selfXml 文件所在文件
    5. static final String[] namespaceForPrefix = {"xsi","HIP","SAP","SAP09","CS"};
    6. //用到的所有名称空间

    既然要重组,首先要对比,从standardXml根节点开始取Element,然后用xPath去selfXml文件中看是否也存在这个节点,如果存在这把这个节点从selfXml的所有信息(属性,值等)取出来放到newXml中依次类推,这样一份和standardXml节点顺序一样的xml文件就出来了。


    两个文件夹中的xml放到两个集合中,然后通过下面这个方法取出同名的两份放到数组中返回。

    1. /**
    2. * 每次提供两份xml文件用于对比
    3. * xmls[0]为标准文件夹中取的xml,
    4. * xmls[1]为待对比的xml文件
    5. */
    6. public File[] provideXML(List<File> standaredList,List<File> selfsList){
    7. File[] xmls = new File[2];
    8. for(File standaredXML : standaredList){
    9. String tempName = standaredXML.getName();
    10. int findNum = 0;
    11. for(int i = 0; i < selfsList.size(); i++){
    12. if(tempName.equals(selfsList.get(i).getName())){
    13. File selfXML = selfsList.get(i);
    14. xmls[0] = standaredXML;
    15. xmls[1] = selfXML;
    16. standaredList.remove(standaredXML);
    17. selfsList.remove(selfXML);
    18. findNum++;
    19. return xmls;
    20. }
    21. }
    22. if(findNum == 0){
    23. standaredList.remove(standaredXML);
    24. return null;
    25. }
    26. }
    27. return null;
    28. }


    下面这个方法算是核心,进行element重组:

    1. public HashMap<Integer,Object> loopAndCreateXml(HashMap<Integer,Object> map){
    2. if(newDoc == null){
    3. newDoc = this.createDocument();
    4. }
    5. Element standerdXmlElement = (Element) map.get(1);
    6. xpathSelector = DocumentHelper.createXPath(standerdXmlElement.getUniquePath());
    7. Element e = (Element)xpathSelector.selectSingleNode(((Document) map.get(2)));
    8. if(e != null){
    9. System.out.println("提取的节点名称:" + e.getQualifiedName());
    10. if(e.getParent() != null){
    11. xpathSelector = DocumentHelper.createXPath(e.getParent().getUniquePath());
    12. fatherElement = (Element)xpathSelector.selectSingleNode(newDoc);
    13. }
    14. if(fatherElement == null){
    15. fatherElement = newDoc.addElement(e.getQualifiedName(),e.getNamespaceURI());
    16. fatherElement.setAttributes(e.attributes());
    17. String spaceUri = "";
    18. Element rootElt = ((Document) map.get(2)).getRootElement();//获取根节点
    19. String defNamespace = rootElt.getNamespaceURI();
    20. //处理名称空间
    21. if(defNamespace != null)
    22. {
    23. nameSpaceMap.put("defu",defNamespace);
    24. }
    25. for(String nameSpace : Paths.namespaceForPrefix){
    26. spaceUri = rootElt.getNamespaceForPrefix(nameSpace) != null ? rootElt.getNamespaceForPrefix(nameSpace).getURI() : null;
    27. if(spaceUri != null){
    28. nameSpaceMap.put(nameSpace,spaceUri);
    29. fatherElement.addNamespace(nameSpace,spaceUri);
    30. }
    31. }
    32. }else{
    33. fatherElement = fatherElement.addElement(e.getQualifiedName(),e.getNamespaceURI());
    34. fatherElement.setText(e.getText());
    35. fatherElement.setAttributes(e.attributes());
    36. }
    37. }

    源码已经上传,想了解的朋友可以去下源码。无论代码写的怎样,总之还是给我的工作带来了便利,也只有这样我才能真正体验到编程的乐趣。

    QQ群:105901697(电脑爱好者),112456134(任务群)欢迎加入

本文出自 “Thinking-Programming博客,请务必保留此出处http://zp1990.blog.51cto.com/2267648/1289516

猜你在找的XML相关文章