如何使用xmlns创建根节点:xsi但没有前缀?

时间:2017-08-10 21:35:28

标签: c# xml xml-namespaces xmldocument

创建没有前缀的根节点,但显示xmlns:xsi="blah"的正确方法是什么?基本上我想要这样的东西:

<EDSCrate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="EDS_Crate_2010-02-10.xsd" version="0.95">
    <Whatever>
    </Whatever>
</EDSCrate>

但是,我尝试了很多方法,它只是不会给我一个没有命名空间的简单节点,即使它确实如此,它也没有在属性中给我正确的xmlns:xsi

我想避免任何黑客攻击,例如覆盖ToString并自己替换XmlWriter中的文字。

string uri = "http://www.w3.org/2001/XMLSchema-instance";

XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.AppendChild(doc.CreateXmlDeclaration("1.0", "UTF-8", null));

nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("xsi", uri);

XmlElement root = doc.CreateElement("EDSCrate", uri);
// at this point, it already added xmlns="http://www.w3.org/2001/XMLSchema-instance" without me doing anything
root.RemoveAllAttributes();
// but i want xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"!!
root.SetAttribute("xmlns:xsi", uri);
root.SetAttribute("xsi:noNamespaceSchemaLocation", "EDS_Crate_2010-02-10.xsd");

1 个答案:

答案 0 :(得分:1)

string uri = "http://www.w3.org/2001/XMLSchema-instance";

var doc = new XmlDocument();
doc.AppendChild(doc.CreateXmlDeclaration("1.0", "UTF-8", null));

var root = doc.CreateElement("EDSCrate");
doc.AppendChild(root);
root.AppendChild(doc.CreateElement("Whatever"));

var attr = doc.CreateAttribute("xsi", "noNamespaceSchemaLocation", uri);
attr.InnerText = "EDS_Crate_2010-02-10.xsd";
root.SetAttributeNode(attr);

root.SetAttribute("version", "0.95");