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#L2456 做 return 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);
}
我正在尝试使用 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#L2456 做 return 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);
}