如何通过部分名称(包含)获取节点?

时间:2016-05-31 15:45:33

标签: c# xml linq-to-xml

我有以下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="&#xD;&#xA;            " 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="&#xD;&#xA;            " 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>

我也必须更改属性,但这是我稍后会遇到的另一个问题,因为那不是我首先要问的。

1 个答案:

答案 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;