【问题标题】:Get rid of xmlns attribute when adding node to existing xml将节点添加到现有 xml 时摆脱 xmlns 属性
【发布时间】:2015-09-21 08:31:13
【问题描述】:

我有一个 XML 文件:

<ns2:root xmlns:ns2="namespace">
    <ns2:a>
        <ns2:b>some content</b>
        <ns2:c>some content</c>
        <ns2:d>some content</d>
    </a>
</root>

我需要在特定的地方添加一个新节点,我的代码是:

var doc = XDocument.Load(file);
XNamespace ns2 = "namespace";
doc.Element(ns2 + "root").Element(ns2 + "a").Element(ns2 + "c").AddAfterSelf(
    new XElement(ns2+"new", 
        new XElement("new1", 
            new XElement("new2","some content"),
            new XElement("new3", "some content"))));

输出是:

<ns2:root xmlns:ns2="namespace">
    <ns2:a>
        <ns2:b>some content</b>
        <ns2:c>some content</c>
        <ns2:new>
            <new1 xmlns="">
                <new2>some content</new2>
                <new3>some content</new3>
            </new1>
        </new>
        <ns2:d>some content</d>
    </a>
</root>

期望的输出是:

<ns2:root xmlns:ns2="namespace">
    <ns2:a>
        <ns2:b>some content</b>
        <ns2:c>some content</c>
        <ns2:new>
            <new1>
                <new2>some content</new2>
                <new3>some content</new3>
            </new1>
        </new>
        <ns2:d>some content</d>
    </a>
</root>

如何避免将 xmlns 属性添加到节点 new1?


在所需输出中编辑错误。

【问题讨论】:

  • 信息的角度来看,它们是相同的。通常,您不应该关心 XML 工具如何选择表示信息,除非您将此 XML 输入到实际上不能与 XML 一起使用的东西中,否则这不应该是一个问题——如果它与“完整的字符串”一起使用如果尖括号看起来像 XML”,但需要绝对格式,那么通常最好推动更改损坏的组件,而不是尝试在 XML 中强制使用特定的表示形式。
  • 您的示例 XML 无效,更正后我无法重现您声称的行为。我强烈怀疑在您的 XML 中的某处实际上有一个 xmlns="...",这会显着改变事情。此外,您想要的输出与您当前的输出非常不同 - 它包含带有文本的 new1new2 元素,而不是包含带有文本的 new2new3new1。请展示一个简短但完整的示例来说明问题,并使您的问题自洽。
  • 同样的事情发生在我身上。我的代码是- var target = doc.Descendants().Where(p => p.Name.LocalName == "Flight" && p.Value == flightNum).Single(); target.Value = flightNumWithoutSuffix; //更新元素值 target.AddAfterSelf("Suffix", suffix);它正在向 Xdocument 添加一个元素作为 suffix 我的期望是它应该是 suffix

标签: c# linq-to-xml xml-namespaces


【解决方案1】:

在需要位于站点地图命名空间中的每个元素名称之前添加“ns2 +”

var doc = XDocument.Load(file);
XNamespace ns2 = "namespace";
doc.Element(ns2 + "root").Element(ns2 + "a").Element(ns2 + "c").AddAfterSelf(
    new XElement(ns2+"new", 
        new XElement(ns2+"new1", 
            new XElement(ns2+"new2","some content"),
            new XElement(ns2+"new3", "some content"))));

【讨论】:

  • 已经试过了,每个节点前都有“ns2:”前缀,这不是我需要的。
  • 放一个默认命名空间,如 -XNamespace defaultNs = "tempuri.org/default";然后使用新的 XElement(defaultNs +"new1"
【解决方案2】:

在元素解决我的问题之前添加默认命名空间 XNamespace defaultNs = "http://www.iata.org/IATA/2007/00"; target.AddAfterSelf(new XElement(defaultNs + "Suffix", suffix));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2017-04-25
    相关资源
    最近更新 更多