我想获取具有重复元素的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节点。