【问题标题】:Inserting and removing nodes from an XML namespace在 XML 命名空间中插入和删除节点
【发布时间】:2013-07-29 11:13:43
【问题描述】:

我正在尝试替换节点的名称,但出现以下错误“引用节点不是此节点的子节点”。我想我知道为什么会这样,但似乎无法解决这个问题。这是 XML:

 <payload:Query1 xmlns="" xmlns:payload="" xmlns:xsi="" xsi:schemaLocation="">
        <payload:QueryId>stuff</payload:QueryId>
        <payload:Data>more stuff</payload:Data>
 </payload:Query1>

这里是 C# 位:

doc.Load(readStream);
nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("payload", "location");
XmlNode Query1 = doc.SelectSingleNode("//payload:Query1", nsmgr);

public XmlDocument sendReply(args)
{
    XmlNode newNode = doc.CreateElement("payload:EditedQuery");
    Query.InsertBefore(newNode, Query1);
    Query.RemoveChild(Query1);
    return doc;
}

我正在尝试用“EditedQuery”替换“Query”,但他不起作用。

【问题讨论】:

    标签: c# xml parsing namespaces children


    【解决方案1】:

    如果你可以使用.Net 3.5LINQ to XML,

    XElement root = XElement.Load(readStream);
    XNamespace ns = "http://somewhere.com";
    XElement Query1 = root.Descendants(ns + "Query1").FirstOrDefault();
    // should check for null first on Query1...
    Query1.ReplaceWith(new XElement(ns + "EditedQuery"));
    

    或者,如果您不知道命名空间,或者不想对其进行硬编码:

    XElement root = XElement.Load(readStream);
    XElement Query1 = root.Descendants()
                          .FirstOrDefault(x => x.Name.Localname == "Query1");
    // should check for null first on Query1...
    Query1.ReplaceWith(new XElement(Query1.Name.Namespace + "EditedQuery"));
    

    查看Jon Skeet的原因why to use LINQ to XML here over older API's

    【讨论】: