无法使用c#从XElement中删除空xmlns属性

时间:2015-05-01 04:47:52

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

在发布此问题之前,我已经在堆栈上尝试了所有其他解决方案,但没有成功。

我无法使用C#从XElement中删除空xmlns属性,我尝试了以下代码。

XElement.Attributes().Where(a => a.IsNamespaceDeclaration).Remove();

另一个发布here

的人
foreach (var attr in objXMl.Descendants().Attributes())
{
    var elem = attr.Parent;
    attr.Remove();
    elem.Add(new XAttribute(attr.Name.LocalName, attr.Value));
}

4 个答案:

答案 0 :(得分:9)

图片这是你的xml文件

<Root xmlns="http://my.namespace">
    <Firstelement xmlns="">
        <RestOfTheDocument />
    </Firstelement>
</Root>

这是你期待的

<Root xmlns="http://my.namespace">
    <Firstelement>
        <RestOfTheDocument />
    </Firstelement>
</Root>

我认为下面的代码就是你想要的。您需要将每个元素放入正确的命名空间,并删除受影响元素的任何xmlns =''属性。后一部分是必需的,否则LINQ to XML基本上试图给你留下

的元素
<!-- This would be invalid -->
<Firstelement xmlns="" xmlns="http://my.namespace">

以下是代码:

using System;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        XDocument doc = XDocument.Load("test.xml");
        foreach (var node in doc.Root.Descendants())
        {
            // If we have an empty namespace...
            if (node.Name.NamespaceName == "")
            {
                // Remove the xmlns='' attribute. Note the use of
                // Attributes rather than Attribute, in case the
                // attribute doesn't exist (which it might not if we'd
                // created the document "manually" instead of loading
                // it from a file.)
                node.Attributes("xmlns").Remove();
                // Inherit the parent namespace instead
                node.Name = node.Parent.Name.Namespace + node.Name.LocalName;
            }
        }
        Console.WriteLine(doc); // Or doc.Save(...)
    }
}

答案 1 :(得分:2)

如果将父元素的名称空间添加到元素中,则空名称空间标记将消失,因为该元素位于同一名称空间中,因此不需要。

答案 2 :(得分:0)

您是否尝试按值获取Xelement.Attribute以查看该元素是否为&#34; xmlns&#34;在删除之前。

Xelement.Attribute("xmlns").Value 

答案 3 :(得分:0)

这是一种更简单的方法。我相信,当您创建单独的xml段,然后将它们加入文档时,就会发生这种情况。

xDoc.Root.SaveDocument(savePath);
private static void SaveDocument(this XElement doc, string filePath)
{
    foreach (var node in doc.Descendants())
    {
        if (node.Name.NamespaceName == "")
        {
            node.Name = ns + node.Name.LocalName;
        }
    }
    using (var xw = XmlWriter.Create(filePath, new XmlWriterSettings
    {
        //OmitXmlDeclaration = true,
        //Indent = true,
        NamespaceHandling = NamespaceHandling.OmitDuplicates
    }))
    {
        doc.Save(xw);
    }
}