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

How to get a node by its partial name (contains)?

我有以下 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>

我想做的是替换包含字符串 "ns0".

的节点及其所有子节点的名称

我试过的是这样的:

var xmlDocument = XDocument.Load(pathXmlFile);
var ns0Nodes = xmlDocument.Descendants("ns0").ToList();
ns0Nodes.ForEach(node => node.Name = "NewName");
xmlDocument.Save("MyNewFile.xml");

但是,这只能获取具有确切名称的节点,而我想获取名称中包含 "ns0" 字符串的节点。尝试使用 xpath 字符串,但它抛出一个异常,指出节点名称不允许使用特定字符(如“/”)。

提前致谢。

编辑:预期输出:

<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>

我还必须更改属性,但那是我稍后会遇到的另一个问题,因为这不是我最初提出的要求。

"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;