【发布时间】:2013-06-27 02:48:21
【问题描述】:
我有以下 XML 实例:
<entities>
<person>
James
</person>
<legalEntity legalName="ACME">
</legalEntity>
<criminalOrganization>
<organizationName>Mafia</organizationName>
</criminalOrganization>
</entities>
并希望打印出每个实体的类型和名称。
type 只是元素名称(person、legalEntity 或 criminalOrganization),
name 根据实体的种类定义不同。
所以我有以下代码:
XPathExpression expr = xpath.compile("/entities/(person|legalEntity|criminalOrganization)");
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0 ; i < nodes.getLength() ; i++) {
Node node = nodes.item(i);
String nodeName = node.getNodeName();
XPathExpression exprInner = xpath.compile("text()|@legalName|organizationName/text()");
String name = (String) exprInner.evaluate(node);
System.out.printf("node type = %s, name = %s\n", nodeName, name);
}
代码产生输出:
node type = person, name =
James
node type = legalEntity, name = ACME
node type = criminalOrganization, name =
所以基本上,person 实体的名称提取成功(我只需要修剪它),legalEntity 的名称也正确提取,但 criminalOrganization 的名称不是。
经过调查,我发现这是因为 XPath union 结构中的第一个表达式:text()|@legalName|organizationName/text() 在 criminalOrganization 的情况下也会计算(我想是一些空字符串值)所以它是作为整个联合表达式的计算值返回(而不是最后一个组件organizationName/text())。
我的问题是:
为什么在
legalEntity的情况下也不会发生这种混淆?如何在
unionXPath 表达式中包含元素名称谓词,以确保每个组件仅针对预期类型进行评估。 IE。text()用于person元素,@legalName用于legalEntity元素和organizationName/text()用于criminalOrganization元素?
【问题讨论】: