XdmNode.Children(uri, localname) 没有返回结果

XdmNode.Children(uri, localname) not returning results

我正在尝试使用 node.Children(uri, localName) 获取节点的所有子 XdmNode,但我收到一个空列表。同时枚举node.Children()returns正确结果

这是一个错误吗?

此致, 佩特科·斯托亚诺夫

代码示例 1:不工作

var href = record.Children(WellKnownXmlNamespace.XInclude, "include").First().GetAttributeValue("href");

代码示例 2:工作

var href = record.Children().First(
                    p => p.NodeKind == XmlNodeType.Element 
                            && WellKnownXmlNamespace.XInclude.Equals(p.NodeName.Uri) 
                            && "include".Equals(p.NodeName.LocalName))
                    .GetAttributeValue("href");

代码示例 3:工作

var enumerator = record.EnumerateAxis(XdmAxis.Child, new QName(WellKnownXmlNamespace.XInclude, "include"));
enumerator.MoveNext();
var href = enumerator.Current.GetAttributeValue("href");

完整的 XML 看起来像:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recordSeries xmlns="uri:rs" xmlns:xi="http://www.w3.org/2001/XInclude">
    <record number="R0001">
      <xi:include href="r0001.xml"/>
    </record>
</recordSeries>

如果我对 API 的理解正确的话,这似乎是一个错误, selection

       var href = record.Select(Steps.Child("http://www.w3.org/2001/XInclude", "include")).First().GetAttributeValue("href");

有效,

       record.Children("include").First().GetAttributeValue("href");

       record.Children("http://www.w3.org/2001/XInclude", "include").First().GetAttributeValue("href");

不起作用。使用 Saxon .NET HE 10.5.1 测试。

所以错误是在 public IEnumerable<XdmNode> Children(String uri, String localName) https://saxonica.plan.io/projects/saxonmirrorhe/repository/he/revisions/saxon10/entry/src/main/csharp/api/Saxon.Api/Model.cs#L2456return Children().SelectMany(Steps.Child(uri, localName).Func); 基本上尝试 select 命名空间 uri 和本地名称的孙子。

也许你可以使用扩展方法

public static IEnumerable<XdmNode> Children2(this XdmNode node, string ns, string localName)
{
    return Steps.Child(ns, localName).Func.Invoke(node);
}

错误修复之前的时间。

或者我之前提到的record.Select(Steps.Child("http://www.w3.org/2001/XInclude", "include"))

在此处作为错误提出:

https://saxonica.plan.io/issues/5005

请监控该问题以跟踪解决方案。

已提交修复错误问题。作为解决方法,用户可以使用方法 Children(IPredicate filter) 和他们自己的谓词来过滤 ns 和本地名称。请参阅下面的示例:

    static IPredicate<XdmNode> ExpandedNamePredicate(String ns, String local)
    {
        return new Predicate<XdmNode>(item =>
        {
            if (!(item is XdmNode)) { return false; }
            XdmNode node = (XdmNode)item;
            return node.NodeKind == XmlNodeType.Element
                    && node.NodeName.LocalName.Equals(local) && node.NodeName.Uri.Equals(ns);
        });
    }


   static void Main(string[] args)
    {
        var processor = new Processor();

        var docBuilder = processor.NewDocumentBuilder();

        var doc = docBuilder.Build(new Uri(new Uri(AppContext.BaseDirectory), "XMLFile1.xml"));

        var record = doc.Select(Steps.Descendant("record")).First();

        Console.WriteLine(record);

        var include = record.Children(ExpandedNamePredicate("http://www.w3.org/2001/XInclude", "include")).First();

        Console.WriteLine(include);

        var href = include.GetAttributeValue("href");

        Console.WriteLine(href);

    }