[英]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.