簡體   English   中英

條件表達式中的XPath謂詞

[英]XPath predicates in conditional expressions

我有以下XML實例:

<entities>
    <person>
        James
    </person>
    <legalEntity legalName="ACME">
    </legalEntity>
    <criminalOrganization>
        <organizationName>Mafia</organizationName>
    </criminalOrganization>
</entities>

並希望打印出每個實體的類型名稱

type只是元素名稱( personlegalEntitycriminalOrganization ), 名稱根據實體的種類而不同地定義。

所以我有以下代碼:

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() )。

我的問題是:

  1. 為什么在legalEntity也不會發生這種混淆?

  2. 如何在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM