我正在挖掘这些:https://saxonica.plan.io/boards/3/topics/1468,http://saxon-xslt-and-xquery-processor.13853.n7.nabble.com/C-How-to-get-original-Node-from-XdmNode-td5511.html,但无法绕过我的脑袋。
我已经安装了Saxon-HE 9.5.1.5 NuGet包,并尝试将XPath 2.0功能与XmlDocument挂钩。
这是我目前根据我读过的内容设置的代码:
using Saxon.Api;
using System;
using System.Xml;
namespace MainTest
{
class Program
{
static void Main(string[] args)
{
SaxonFromXMLDoc();
}
private static void SaxonFromXMLDoc()
{
string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
path += System.IO.Path.DirectorySeparatorChar;
// Create an XML document.
XmlDocument xmldocument = new XmlDocument();
xmldocument.Load(path + "test.html");
// Create a Saxon processor.
Processor sxp = new Processor();
// Load the source document.
XdmNode document = sxp.NewDocumentBuilder().Wrap(xmldocument);
// XPath.
XPathCompiler xpath = sxp.NewXPathCompiler();
xpath.Caching = true;
// Query for items.
foreach (XdmNode item in xpath.Evaluate("descendant-or-self::*/attribute::*[matches(name(), \"^dx\")]", document))
{
// Get an XmlNode for manipulation.
XmlNode xmlnode = (XmlNode)((VirtualNode)item.Unwrap()).getUnderlyingNode();
Console.WriteLine(xmlnode.OuterXml);
}
Console.ReadKey();
}
}
}
好吧,正如预期的那样(我没有使用这些类的指令),这会抛出2个错误:
#1: The type 'net.sf.saxon.om.Sequence' is defined in an assembly that is not referenced. You must add a reference to assembly 'saxon9he, Version=9.5.1.5, Culture=neutral, PublicKeyToken=e1fdd002d5083fe6'.
#2: The type or namespace name 'VirtualNode' could not be found (are you missing a using directive or an assembly reference?)
我似乎无法using net.sf.saxon.om.Sequence
或其他任何东西,没有参考。
我必须做些什么来完成这项工作?
答案 0 :(得分:1)
如果要使用saxon9he.dll而不是saxon9api.dll中定义的类(如VirtualNode或Sequence),则需要添加using指令并将此DLL的依赖项添加到项目中。 / p>
有关这些类的文档,您必须转到Java文档。此DLL是使用与Saxon-HE / J产品相同的Java源代码构建的,因此Javadoc文档都适用;你需要了解基本类型的映射,比如boolean / string / int,但它相当明显。 Visual Studio中的对象浏览器将以.NET术语显示这些类/方法的签名。
我原本希望Saxon提供一种方法,直接从XdmNode到底层的XmlNode,而不使用这些类,但是看一下它似乎不存在的文档。这似乎是一种疏忽,我会看看我们是否可以添加它。