![](/img/trans.png)
[英]Combining conditional expressions with “AND” and “OR” predicates using the JPA criteria API
[英]XPath predicates in conditional expressions
我有以下XML實例:
<entities>
<person>
James
</person>
<legalEntity legalName="ACME">
</legalEntity>
<criminalOrganization>
<organizationName>Mafia</organizationName>
</criminalOrganization>
</entities>
並希望打印出每個實體的類型和名稱 。
type只是元素名稱( person
, legalEntity
或criminalOrganization
), 名稱根據實體的種類而不同地定義。
所以我有以下代碼:
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
也不會發生這種混淆?
如何在union
XPath表達式中包含元素名稱謂詞,以確保每個組件僅針對預期類型進行求值。 即text()
代表person
元素, @legalName
代表legalEntity
元素, organizationName/text()
代表criminalOrganization
organizationName/text()
元素?
我認為您的解決方案有些奇怪,但您可以嘗試使用self::
。
試試看(未測試):
XPathExpression exprInner
= xpath.compile("self::person/text()|
self::legalEntity/@legalName|
self::criminalOrganization/organizationName/text()");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.