【问题标题】:How to create root node with xmlns:xsi but no prefix?如何使用 xmlns:xsi 但没有前缀创建根节点?
【发布时间】:2018-01-19 07:09:02
【问题描述】:

创建不带前缀的根节点但显示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

我想避免任何 hack,例如覆盖 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");

【问题讨论】:

    标签: c# xml xml-namespaces xmldocument


    【解决方案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");
    

    【讨论】:

    • 这到底是怎么回事,所以如果我通过 CreateElement 将 uri 作为参数传递,它只会输入 xmlns: 但如果我不传递 uri,那么它会从命名空间管理器中获取它并放入xmlns:xsi?!?!
    【解决方案2】:

    我发现使用Linq2Xml 更容易。

    XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
    
    var xdoc = new XDocument(
                    new XElement(
                        "EDSCrate",
                        new XAttribute(XNamespace.Xmlns + "xsi", xsi),
                        new XAttribute(xsi + "noNamespaceSchemaLocation", "EDS_Crate_2010-02-10.xsd"),
                        new XAttribute("version", "0.95"),
                        new XElement("Whatever","")
                    )
                );
    var xml = xdoc.ToString();
    

    输出:

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

    【讨论】:

    • 我没有尝试使用 Linq,但我相信您的解决方案也可以!
    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多