2017-08-10 71 views
0

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

<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
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"); 
+0

这是什么,所以如果我通过CreateElement作为参数传递uri,它只会放'xmlns:'但如果我没有通过uri,那么它会从命名空间管理器中抓取它并将'xmlns:xsi'? !?! – codenamezero

1

我发现使用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(); 

OUTPUT:

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

我没有尝试使用LINQ,但我敢肯定,你的解决方案的工作呢! – codenamezero