如何通过停用xpath来修复xml文档数据

时间:2015-08-24 18:18:24

标签: java xml xpath

我想获取具有重复元素的XML文档的XPath。

示例:

<Return>
  <ReturnData>
    <Person>
      <Name>Yohanna</Name>
    </Person>
    <Person>
      <Name>Jacoub</Name>
    </Person>
  </ReturnData>
</Return>

我想归还给我:

1. /Return/ReturnData/Person[1]/Name=Yohanna
2. /Return/ReturnData/Person[2]/Name=Jacoub

我有一个实现,可以检索任何XML文档的XPath但是我有重复XPath的问题,我不确定如何将XPath索引为唯一,因此我可以为{{1}分配值我在上面展示过。我想我应该使用 Map 数据结构,但我不确定如何做到这一点。

以下是我的代码

Key/Value

目前此代码仅返回 未编入索引的XPath列表

输出:

public List<String> getXPaths ( InputStream stream ) throws ParserException {
    Document document = XMLUtils.getDocument(  stream );
    return getXPaths( document.getDocumentElement() );
}

public List<String> getXPaths ( Node node ) {
    List<String> xpaths = iterate( node, "");
    return xpaths;
}


public List<String> iterate ( Node node, String parentPath )  {

    List<String> xpaths = new ArrayList<String>();

    if ( node.getNodeType() == Node.ELEMENT_NODE ) {

        Element element = ( Element ) node;
        parentPath = parentPath + "/" +  element.getTagName();

        for ( int nIndex = 0; nIndex<node.getChildNodes().getLength(); nIndex++ ) {
            xpaths.addAll( iterate(node.getChildNodes().item(nIndex) , parentPath ) ) ;
        }
    }
    else if ( node.getNodeType() == Node.TEXT_NODE  ) {
        if (  node.getTextContent().trim().length() !=0 ) {
            logger.debug("XPath found : " + parentPath );
            xpaths.add( parentPath );
        }
    }
    else {
        logger.debug("Unknown node type for : " + node.getNodeName());
    }
    return xpaths;
}

非常感谢任何帮助或帮助。

另一个编辑:

/Return/ReturnData/Person/Name
/Return/ReturnData/Person/Name

输出:

public String getFullXPathV2(Node n) {
    ...etc.

            while (null != prev_sibling) {

                if (prev_sibling.getNodeType() == node.getNodeType()) {
                    if (prev_sibling.getNodeName().equalsIgnoreCase(node.getNodeName())) { 
                        prev_siblings++;
                    }
                }
                prev_sibling = prev_sibling.getPreviousSibling();
            }

            // Edit here
            if(prev_siblings == 1) {
                continue;
            } 

            else 
                builder.append("[").append(prev_siblings).append("]");

        } 

        else if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
            builder.append("/@");
            builder.append(node.getNodeName());
        }
    }
    return builder.toString();
}

这似乎没问题但是/ Return / ReturnData / Person / Name = Yohanna应该是/ Person [1]来表示它首次出现Person节点。

0 个答案:

没有答案