XdmNode行号和列

本文关键字:XdmNode | 更新日期: 2023-09-27 17:56:41

我需要从XdmNode获取源文档中的行号和列。我知道我可以用:

XmlNode n = (XmlNode)((VirtualNode)node.Unwrap()).getUnderlyingXmlNode();
IXmlInfo xInfo = (IXmlInfo)n;
int line = xInfo.LineNumber;
int col = xInfo.LinePosition;

但是节点。Unwrap() 是 net.sf.saxon.tree.tiny.TinyElementImpl 类型的对象,不能强制转换为 VirtualNode,也许是因为我没有使用 DocumentBuilder.Wrap(XmlDocument) 而是使用 DocumentBuilder.Build(XmlReader) 加载文档?

使用XmlReader的方法比XmlDocument版本快得多。如何从XdmNode获取行号和列?

XdmNode行号和列

补充一下O'Neil的回应:

(a) .NET 上的 XdmNode 没有 LineNumber 和 ColumnNumber 属性,这与 Java 等效属性不同。我们将添加这些。但是,当然,只有在行号信息可用时,属性才会返回任何有用的内容。

(b) 如果没有这些属性,您可以使用 XdmNode.Implementation.getLineNumber() 和 XdmNode.Implementation.getColumnNumber()。

(c) 除非在文档生成器上设置了 IsLineNumbering 属性,否则不会保留行/列信息。

(d) 对于上述警告,如果您使用默认配置选项从 Uri 或 Stream 或 TextReader 构建文档,则行/列编号应该有效(特别是,如果使用内置的 Xerces 解析器来解析 XML 文档)

(e) 当使用 XmlReader 解析文档时,有 Saxon 代码试图将行/列信息从 MS 解析器获取到 Saxon 构造的节点中,但我们最初的测试表明它可能不起作用。