我在选择xml文档中的一个节点或节点列表时遇到问题。 如果没有SAXON HE,我会这样做:
xmlDocument.load(someDocument);
var node = xmlDocument.SelectNodes(path);
foreach(var nod in node) { //doSomething}
然后你可以这样做:
nod.SelectSingleNode(path);
你可以
/../SomeElement
在路径中,所以你知道你会退出这个元素,检查xml文档中的一些不同的元素... 但在撒克逊人中我只找到了一种方法:
Processor xmlDetailProcessor = new Processor();
DocumentBuilder detailBuilder = xmlDetailProcessor.NewDocumentBuilder();
XdmNode xdmDetailNode = detailBuilder.Build(detail);
XPathCompiler detailCompiler = xmlDetailProcessor.NewXPathCompiler();
detailCompiler.DeclareNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
选择节点但不知道整个元素,所以你不能去其他元素......
答案 0 :(得分:0)
我通过使用xml文档的副本解决了这个问题。当我得到通过代码重复的元素时,我将所有相同的元素放在列表中,并暂时从文档中删除它们,只留下一个...然后我评估整个文档的表达式(因为它只包含这种类型的一个元素),然后用第二个元素更改当前元素,依此类推......
答案 1 :(得分:0)
我不太了解你的问题,说它"选择节点但不知道整个元素"。评估XPath表达式的结果通常是XdmValue,它允许XPath 2.0类型系统中的任何值。如果您知道表达式将选择单个节点,那么您可以将该节点作为value.getList()(0),并将生成的XdmItem转换为XdmNode。从XdmNode可以访问NodeName,NodeKind和StringValue等属性,可以使用Parent属性访问父节点,也可以使用XdmNode作为上下文项来进一步导航,以评估更多XPath表达式
对于在树周围进行C#导航,API并未真正优化;在Saxon中,尽可能多地使用XSLT或XQuery进行处理,而不是使用C#,这样做会好得多。但是,如果您想要做的话,您当然可以从所选节点的树中导航。