【问题标题】:Saxon HE select node in xml documentSaxon HE 选择 xml 文档中的节点
【发布时间】:2014-09-10 06:05:25
【问题描述】:

我无法在 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");

选择节点但不知道整个元素,所以你不能去其他一些元素...

【问题讨论】:

    标签: c# xml xml-parsing saxon xpath-2.0


    【解决方案1】:

    我已经通过使用 xml 文档的副本解决了这个问题。当我到达通过代码重复的元素时,我将所有相同的元素放在列表中,并暂时从文档中删除它们,只留下一个......然后我评估整个文档的表达式(因为它只包含这种类型的一个元素),然后用第二个元素更改当前元素,依此类推...

    【讨论】:

      【解决方案2】:

      我不太明白你的问题,说它“选择节点但不知道整个元素”。 XPath 表达式的计算结果通常是一个 XdmValue,它允许 XPath 2.0 类型系统中的任何值。如果您知道您的表达式将选择单个节点,那么您可以将该节点作为 value.getList()(0) 获取,并将生成的 XdmItem 转换为 XdmNode。从 XdmNode 中,您可以访问 NodeName、NodeKind 和 StringValue 等属性,您可以使用 Parent 属性访问父节点,或者您可以使用 XdmNode 作为上下文项在树中进行进一步导航,以评估进一步的 XPath 表达式.

      API 并没有真正针对在树周围进行 C# 导航进行优化;在 Saxon 中,尽可能多地在 XSLT 或 XQuery 中进行处理,而不是在 C# 中进行处理要好得多。但是,如果您想这样做,您当然可以从选定的节点在树中导航。

      【讨论】:

      • 好吧,我的问题是,当我选择一些 XdmNode 时,这个节点的子节点是另一个包含 xpath 表达式的节点...这个 xpath 表达式可以包含一个 if 语句,它可以有一些值来自xml文档中的一些不同位置作为条件,而不是来自该节点的值......如果我们有 lalasomeXpath 和我们的 XdmNode 是 item1,someXpath 不能包含带有条件的 if 语句,例如 if(//Condition[text()=lala])...
      • 抱歉,您必须更清楚地解释这一点。我看不出使用 API 编译和执行从源文档中读取的 XPath 表达式有任何困难。
      • 在文档中的某个时刻,我到达了在文档中出现更多的节点,但每个节点内部都有不同的值......对于每个元素,我必须调用服务器以将数据写入数据库...所以当我发现哪个元素在重复时,我使 XdmNode a = builder.Build(repeatingElement)... 在这个 XdmNode 内我有一个 xpath 表达式,它引用了这个节点之外的元素,文档中的一些地方......因为这个节点只包含它自己的子节点,所以如果它引用了这个元素之外的元素,我就无法评估表达式
      • 如果你想要的是原始的,你为什么要构建一个新树作为节点的副本?
      • 因为我有 4 个相同的元素,当涉及到 if 语句时,它总是为 null,因为它只检查第一个元素的条件,而不是其他 3 个...
      猜你喜欢
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多