Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XmlDocument搜索命名空间返回子级_C#_Xml_Xslt - Fatal编程技术网

C# XmlDocument搜索命名空间返回子级

C# XmlDocument搜索命名空间返回子级,c#,xml,xslt,C#,Xml,Xslt,我试图将具有名称空间声明的节点转换为使用前缀。我的第一个尝试是仅使用xslt转换xml,但我开始考虑使用XmlDocument类和SelectNodes方法进行转换。我看到的问题是,当我尝试选择具有名称空间的节点时,它会选择该节点及其子节点。我假设这是因为它正在选择包含子节点的节点 <foo xmlns="some url"> <child>child</child> </foo> XmlDocument xdoc = new XmlDo

我试图将具有名称空间声明的节点转换为使用前缀。我的第一个尝试是仅使用xslt转换xml,但我开始考虑使用XmlDocument类和SelectNodes方法进行转换。我看到的问题是,当我尝试选择具有名称空间的节点时,它会选择该节点及其子节点。我假设这是因为它正在选择包含子节点的节点

<foo xmlns="some url">
    <child>child</child>
</foo>

XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xmlstring);
var query = xdoc.SelectNodes("//*[namespace-uri()='some url']");
查询变量将返回和节点,因此当我循环遍历节点并将其更改为使用前缀时,我得到以下结果

<prefix:foo>
   <prefix:child></prefix:child>
</prefix:foo>
在这种情况下,有没有方法只返回节点?同时使用xslt转换它是否更好

我不认为在使用XDocument和XElement时可以更改名称空间或前缀,所以我使用XmlDocument

更新

所需的结果id将仅是声明所在节点上的前缀。这是有效的xml正确的还是前缀也需要在子项上才能有效

<prefix:foo>
    <child>child</child>
</prefix:foo>

在XPath和XSLT使用的XDM数据模型中,两者之间没有区别

<foo xmlns="some url">
    <child>child</child>
</foo>

从逻辑上讲,名称空间存在于两个元素节点上,在词法序列化中从子元素中省略名称空间被视为一个方便的缩写

因此,是的,如果您搜索具有此名称空间的对象,您将获得这两个元素

现在,你的要求是什么?我不相信您自己完全理解它们,因为您所显示的所需输出实际上不是格式良好的,并且没有声明名称空间前缀。在您的输入中,这两个元素位于同一名称空间中;在输出中,您似乎希望它们位于不同的名称空间中。如果希望以不同的方式处理它们,那么必须使用名称空间以外的其他方法来区分它们


记住,在XDM中,重要的是节点的名称,而不是名称空间声明或前缀;那些只是装饰。节点的名称是其本地名称和名称空间URI的组合。您已经用前缀描述了您的需求,但实际上重要的是名称空间。

这似乎是XSLT的一项任务,因为使用DOM或LINQ to XML时,您必须将任何元素更改为新前缀,这与使用XSLT所做的几乎相同,但是使用XSLT,您可以编写一个通用模板match=*并使用它来构造所需的结果。我不想更改所有节点来添加前缀,只想更改其中包含名称空间声明的节点。你能告诉我们你想要的结果吗?没有任何名称空间声明,你不清楚你想要实现什么?是否希望结果中的子元素不在名称空间中?或者为了保留输入文档中的名称空间,我在xml的根节点中添加了一个名称空间。。prefix=某个url然后我想遍历并重命名在节点上声明了名称空间的所有节点。。。把它改成。。。但在本例中,只有foo元素,而不是子元素。更有意义吗?我只是展示了一个小的xml片段,而不是完整的xml文档作为示例。。xmlns被移动到根节点,在xml中有一个前缀,在与Martin讨论之后,我用前缀替换了xmlns声明中的节点。
<foo xmlns="some url">
    <child xmlns="some url">child</child>
</foo>