簡體   English   中英

使用 XML 標記在 Saxonica 中檢索 XPath 結果

[英]Retrieve XPath result in Saxonica with XML tag

我正在嘗試使用雜項 xpath 和來自net.sf.saxon 的Saxonica API 查詢 XML 文件,但似乎每次查詢操作都返回沒有 xml 標簽的結果 - 只有內容。 有沒有辦法做到這一點(直接或變通)?

更明確地說:

對於 xml 文件

<books>
    <book lang="en">
        <nrpages>140</nrpages>
        <author>J.R.R.Tolkien</author>
    </book>
</books>

和 xpath

//book

我想找回

<book lang="en">
    <nrpages>140</nrpages>
    <author>J.R.R.Tolkien</author>
</book>

代替

140
J.R.R.Tolkien

我試過的:

XPathFactory factory = new XPathFactoryImpl();
XPathExpression compiledXPath = factory.newXPath().compile(xPathExpression);
TinyNodeImpl nodeItem = (TinyNodeImpl) compiledXPath.evaluate(new InputSource(filename), XPathConstants.NODE);
nodeItem.atomize(); // brings only the content
nodeItem.getStrinValue(); // brings only the content

XPath 表達式返回一個節點; 您對節點的操作取決於調用應用程序代碼。 如果您調用node.getStringValue() ,您將獲得 XPath 規范中定義的字符串值(即,與在 XPath 內的節點上調用fn:string()相同)。 類似地, atomize atomize()方法遵循原子化的 XPath 規范(相當於應用於節點的fn:data() 。)

如果您希望將節點序列化為詞法 XML,則有多種實現方式。 如果您要使用 Saxon 的 s9api 接口而不是 JAXP 接口,我會推薦XdmNode.toString() 使用 JAXP 接口然后轉換為內部 Saxon 類會給您帶來兩全其美的結果:您會遇到 JAXP 的所有問題(例如弱類型、沒有 XPath 2.0 支持)而沒有任何好處(跨實現的可移植性)。 但是,如果您更喜歡這樣做,那么序列化 Saxon 節點的最簡單方法可能是靜態方法QueryResult.serialize(NodeInfo) 該方法的 3 參數版本使您可以完全控制序列化屬性,例如縮進和添加 XML 聲明。

使用 XPath 3.1,您還可以通過調用fn:serialize()在 XPath 表達式本身內調用序列fn:serialize() 這將避免在 Java 代碼中使用任何特定於 Saxon 的類和方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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