我有以下XML文档:
<ns0 ns0:action="publish" xmlns:mtc="urn:schemas-tenaris-com:industrial:mtc:mtccertificates" xmlns:ns0="urn:schemas-tenaris-com:industrial:mtd:mtdrequest">
<ns0:values ns0:class="
 " ns0:index="0">
<ns0:value ns0:class="" ns0:index="0"/>
<ns0:value ns0:class="" ns0:index="0">CONROE</ns0:value>
<ns0:value ns0:class="" ns0:index="0">tamsa_exp_manual</ns0:value>
<ns0:value ns0:class="" ns0:index="0">NA</ns0:value>
<ns0:value ns0:class="" ns0:index="0"/>
<ns0:value ns0:class="" ns0:index="0"/>
<ns0:value ns0:class="" ns0:index="0"/>
<ns0:value ns0:class="" ns0:index="0"/>
<ns0:value ns0:class="" ns0:index="0">true</ns0:value>
<ns0:value ns0:class="" ns0:index="0"/>
<ns0:value ns0:class="" ns0:index="0">123</ns0:value>
</ns0:values>
</ns0>
我想要做的是替换包含字符串&#34; ns0&#34;的节点及其所有子节点的名称。
我试过的是:
var xmlDocument = XDocument.Load(pathXmlFile);
var ns0Nodes = xmlDocument.Descendants("ns0").ToList();
ns0Nodes.ForEach(node => node.Name = "NewName");
xmlDocument.Save("MyNewFile.xml");
但是,这只会获得具有确切名称的节点,并且我想获得包含&#34; ns0&#34;的节点。名字中的字符串。尝试使用xpath字符串,但它抛出一个异常,说明节点名称不允许使用特定字符(例如&#34; /&#34;)。
提前致谢。
编辑:预期输出:
<mtc:request ns0:action="publish" xmlns:mtc="urn:schemas-tenaris-com:industrial:mtc:mtccertificates" xmlns:ns0="urn:schemas-tenaris-com:industrial:mtd:mtdrequest">
<mtc:values ns0:class="
 " ns0:index="0">
<mtc:value ns0:class="" ns0:index="0"/>
<mtc:value ns0:class="" ns0:index="0">CONROE</ns0:value>
<mtc:value ns0:class="" ns0:index="0">tamsa_exp_manual</ns0:value>
<mtc:value ns0:class="" ns0:index="0">NA</ns0:value>
<mtc:value ns0:class="" ns0:index="0"/>
<mtc:value ns0:class="" ns0:index="0"/>
<mtc:value ns0:class="" ns0:index="0"/>
<mtc:value ns0:class="" ns0:index="0"/>
<mtc:value ns0:class="" ns0:index="0">true</ns0:value>
<mtc:value ns0:class="" ns0:index="0"/>
<mtc:value ns0:class="" ns0:index="0">123</ns0:value>
</mtc:values>
</mtc:request>
我也必须更改属性,但这是我稍后会遇到的另一个问题,因为那不是我首先要问的。
答案 0 :(得分:2)
“ns0”部分是相应名称所属的命名空间前缀,如其中一个祖先节点中所定义。在你的情况下:
xmlns:ns0="urn:schemas-tenaris-com:industrial:mtd:mtdrequest"
要搜索具有该命名空间的元素(以ns0
为前缀的元素),您需要搜索具有该命名空间的名称。
var ns0Name = "urn:schemas-tenaris-com:industrial:mtd:mtdrequest";
var query = doc.Descendants().Where(e => e.Name.NamespaceName == ns0Name).ToList();
然后,要将名称更改为其他名称空间,您需要为它们创建新名称:
XNamespace mtc = "urn:schemas-tenaris-com:industrial:mtc:mtccertificates";
foreach (var e in query)
e.Name = mtc + e.Name.LocalName;