【发布时间】:2023-03-25 20:17:01
【问题描述】:
我想将 xdmNode 转换为 dom 节点。我找到了以下部分解决方案:
Processor proc = new Processor(false);
XPathCompiler xpath = proc.newXPathCompiler();
Document doc = DocumentUtilities.createEventCountsTestDocument();
XdmNode xdmNode = proc.newDocumentBuilder().wrap(doc);
expression = "/caseFileModel/EventCount/EventCountEvents[EventCmmnId=\"_4cd9cdaabbd244548a32afcd4cf2e1c0\" and EventEventType=\"CREATE\"]/Timestamps/Date[last()]";
value = xpath.evaluate(expression, xdmNode);
XdmNode node = (XdmNode) value;
Node element = ((Node) node.getExternalNode());
System.out.println(element.getTextContent());
其中createEventCountsTestDocument 根据以下 XML 生成文档:
<caseFileModel>
</EventCountEvents>
<EventCountEvents>
<EventCmmnId>_8dbe1b3fa1a04787b2ef35d153d93ae5</EventCmmnId>
<EventEventType>CREATE</EventEventType>
<EventCount>1</EventCount>
<Timestamps>
<Date>2017-03-13T16:47:04Z</Date>
</Timestamps>
</EventCountEvents>
<EventCountEvents>
<EventCmmnId>_4cd9cdaabbd244548a32afcd4cf2e1c0</EventCmmnId>
<EventEventType>CREATE</EventEventType>
<EventCount>1</EventCount>
<Timestamps>
<Date>2017-03-13T16:47:04Z</Date>
</Timestamps>
</EventCountEvents>
</EventCount>
</caseFileModel>
我得到了正确的输出,即2017-03-03T12:00:00Z,但是element 是com.sun.org.apache.xerces.internal.dom.DeferredElementImpl 而不是w3c.dom.Node。这意味着当我调用element.getNodeValue() 时,它会返回null。如果我调用element.getFirstChild().getNodeValue(),它会返回正确的值2017-03-03T12:00:00Z。所以似乎有什么问题,但我找不到。我想找到一种将xdmNode 转换为w3c.dom.Node 而不是DeferredElementImpl 的方法。
【问题讨论】:
-
我不明白问题出在哪里,DOM w3.org/TR/DOM-Level-3-Core/core.html#ID-F68D080 将元素节点的节点值定义为 null 以便您得到正确的结果。
Node是com.sun.org.apache.xerces.internal.dom.DeferredElementImpl实现的接口,不知道你想要什么样的结果。如果你想要一个基于类的对象模型,那么在 Java 世界中使用 JDOM 或 XOM,根据定义,DOM 提供了由类实现的接口。
标签: java dom xpath saxon xpath-2.0