如何防止空白的xmlns从.net的XmlDocument的输出属性?(How to prevent

2019-06-21 06:44发布

当从XmlDocument的在.NET生成XML,空白xmlns属性出现在第一时间没有关联的命名空间中的元件插入; 这可怎么预防?

例:

XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root",
    "whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner"));
Console.WriteLine(xml.OuterXml);

输出:

<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>

所需的输出:

<root xmlns="whatever:name-space-1.0"><loner /></root>

是否有解决方案适用于XmlDocument代码,而不是东西,将文档转换为一个字符串出现OuterXml

我这样做的理由是,看看我是否能符合使用的XmlDocument生成的XML特定协议的标准XML。 空白xmlns属性可能不中断或混淆解析器,但它也没有出现在我已经看到了这个协议的任何使用。

Answer 1:

由于杰里米Lew的答案,并多一点玩耍,我想出如何删除空白xmlns属性:创建不是你想要有一个前缀的子节点时,通过根节点的命名空间。 使用没有在根的前缀命名空间意味着你需要使用相同的命名空间的子元素对他们没有前缀。

固定码:

XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root", "whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner", "whatever:name-space-1.0")); 
Console.WriteLine(xml.OuterXml);

谢谢大家对你的答案害得我在正确的方向!



Answer 2:

这是JeniT的回答的一个变种(谢谢你非常非常顺便说一句!)

XmlElement new_element = doc.CreateElement("Foo", doc.DocumentElement.NamespaceURI);

这消除了复制或重复随处可见的命名空间。



Answer 3:

如果<loner>在示例XML元素不具备xmlns它默认命名空间声明,那么这将是在whatever:name-space-1.0的命名空间,而不是在没有命名空间之中。 如果这是你想要什么,你需要创建该命名空间的元素:

xml.CreateElement("loner", "whatever:name-space-1.0")

如果你想在<loner>元素是在没有命名空间,那么一个已经生成的XML正是你需要什么,你不应该担心xmlns属性,它一直在为你自动添加。



Answer 4:

由于根是没有前缀的命名空间,即希望成为根的任何子女未命名空间也能像你的榜样输出。 该解决方案将是前缀根元素如下所示:

<w:root xmlns:w="whatever:name-space-1.0">
   <loner/>
</w:root>

码:

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement( "w", "root", "whatever:name-space-1.0" );
doc.AppendChild( root );
root.AppendChild( doc.CreateElement( "loner" ) );
Console.WriteLine(doc.OuterXml);


Answer 5:

如果可能的话,创建一个序列化类,那么这样做:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer serializer = new XmlSerializer(yourType);
serializer.Serialize(xmlTextWriter, someObject, ns);

它是安全的,你可以控制属性的命名空间,如果你真的需要更多的控制。



Answer 6:

我已经使用工厂模式解决了这个问题。 我创建的XElement对象的工厂。 作为参数为工厂的实例我已经指定了的XNamespace对象。 所以,每次一个的XElement由工厂命名空间将被自动添加创建。 这里是工厂的代码:

internal class XElementFactory
{
    private readonly XNamespace currentNs;

    public XElementFactory(XNamespace ns)
    {
        this.currentNs = ns;
    }

    internal XElement CreateXElement(String name, params object[] content)
    {
        return new XElement(currentNs + name, content);
    }
}


Answer 7:

是的,你可以防止来自的XmlElement的XMLNS。 首先创建时间它是未来:像

<trkpt lat="30.53597" lon="-97.753324" xmlns="">
    <ele>249.118774</ele>
    <time>2006-05-05T14:34:44Z</time>
</trkpt>

更改代码:又通XML命名空间这样的

C#代码:

XmlElement bookElement = xdoc.CreateElement("trkpt", "http://www.topografix.com/GPX/1/1");
bookElement.SetAttribute("lat", "30.53597");
bookElement.SetAttribute("lon", "97.753324");


文章来源: How to prevent blank xmlns attributes in output from .NET's XmlDocument?