以下是.xml文件的片段。我做了以下事情:
Document doc = docBuilder.parse(filesInDirectory.get(i));
doc.getDocumentElement().normalize();
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression expr1 = xPath.compile("//codes[@ class ='class2']/code[@code]");
Object result1 = expr1.evaluate(doc, XPathConstants.NODESET);
NodeList nodes1 = (NodeList) result1;
现在,
System.out.println("result length"+":"+nodes1.getLength());
returns 2.
我想根据属性名做出逻辑决定,比如(伪代码)
if(nodes1.contains(123))
或
if(nodes1.contains(123) && nodes1.contains(456))
and make decision.
我该怎么做?
<metadata>
<codes class="class1">
<code code="ABC">
<detail "blah" "blah">
</code>
</codes>
<codes class="class2">
<code code="123">
<detail "blah blah"/>
</code>
<code code="456">
<detail "blah blah"/>
</code>
</codes>
</metadata>
答案 0 :(得分:2)
此:
XPathExpression expr1 = xPath.compile("//codes[@class]");
Object result1 = expr1.evaluate(doc, XPathConstants.NODESET);
NodeList nodes1 = (NodeList) result1;
应该返回一个具有class
属性的元素列表。迭代此节点列表,foreach
节点提取[@code]
元素并使用类似
if (node.getNodeValue().equals("123"))
确定您的节点是否具有您要查找的值。
答案 1 :(得分:1)
使用此XPath表达式:
/*/codes[@class]/code[@code = '123' or @code = '456']
选择code
属性的字符串值为字符串code
或"123"
之一且"456"
元素)为{}的元素code
元素codes
元素的子元素,它具有`class属性,并且是XML文档顶部元素的子元素。
基于XSLT的验证:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/codes[@class]/code[@code = '123' or @code = '456']"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的XML文档(更正为格式正确):
<metadata>
<codes class="class1">
<code code="ABC">
<detail/>
</code>
</codes>
<codes class="class2">
<code code="123">
<detail />
</code>
<code code="456">
<detail />
</code>
</codes>
</metadata>
评估XPath表达式并将选定的节点复制到输出中:
<code code="123">
<detail/>
</code>
<code code="456">
<detail/>
</code>
<强>解释强>:
正确使用标准XPath运算符 or
。
答案 2 :(得分:1)
试试这个:
File f = new File("test.xml");
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
InputSource src = new InputSource(new FileInputStream(f));
Object result = xpath.evaluate("//codes[@class='class2']/code/@code",src,XPathConstants.NODESET);
NodeList lst = (NodeList)result;
List<String> codeList = new ArrayList<String>();
for(int idx=0; idx<lst.getLength(); idx++){
codeList.add(lst.item(idx).getNodeValue());
}
if(codeList.contains("123")){
System.out.println("123");
}
if(codeList.contains("123") && codeList.contains("456")){
System.out.println("123 and 456");
}
的说明:强> 的
XPath //codes[@class='class2']/code/@code
将收集code
下的所有codes
值,其类为class2
。
然后,您可以从List
构建NodeList
,以便您可以使用contains()
方法。