我们获得了一份示例文档,并且需要能够为供应商准确地再现文档的结构.但是,我对C#如何处理命名空间感到有点迷茫.以下是该文档的示例:
<?xml version="1.0" encoding="UTF-8"?>
<Doc1 xmlns="http://www.sample.com/file" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sample.com/file/long/path.xsd">
<header>
<stuff>data</stuff>
<morestuff>data</morestuff>
</header>
</Doc1>
Run Code Online (Sandbox Code Playgroud)
我通常会这样做是加载一个空白文档,然后开始填充它:
XmlDocument doc = new XmlDocument();
doc.LoadXml("<Doc1></Doc1>");
// Add nodes here with insert, etc...
Run Code Online (Sandbox Code Playgroud)
一旦我开始编写文档,如何将命名空间和模式放入Doc1元素中?如果我通过将它们包含在LoadXml()中来开始使用Doc1元素中的命名空间和模式,那么所有子元素都具有命名空间 - 这就是禁忌.该文件被拒绝.
换句话说,我必须如图所示完全生产它.(而且我宁愿不只是在C#中编写文本到文件,并希望它是有效的XML).
我正在尝试使用XmlNamespaceManager将命名空间添加到XmlDocument.这是当前的xml:
<?xml version="1.0"?>
<kml>
<Document>
<Placemark>
</Placemark>
</Document>
</kml>
Run Code Online (Sandbox Code Playgroud)
我希望它转换为这个xml(使用XmlNamespaceManager):
<?xml version="1.0"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2"
xmlns:kml="http://www.opengis.net/kml/2.2"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Document>
<Placemark>
</Placemark>
</Document>
</kml>
Run Code Online (Sandbox Code Playgroud)
但我无法更改xml.这是代码,我知道它应该是一个简单的修复:
public void addXmlns()
{
string xml = @"<?xml version=""1.0""?>
<kml>
<Document>
<Placemark>
</Placemark>
</Document>
</kml>";
var xmldoc = new XmlDocument();
xmldoc.LoadXml(xml);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmldoc.NameTable);
//Add the namespaces
nsmgr.AddNamespace("", "http://www.opengis.net/kml/2.2");
nsmgr.AddNamespace("gx", "http://www.google.com/kml/ext/2.2");
nsmgr.AddNamespace("kml", "http://www.opengis.net/kml/2.2");
nsmgr.AddNamespace("atom", "http://www.w3.org/2005/Atom");
nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
string message;
message = xmldoc.InnerXml;
MessageBox.Show(message); // still shows the original xml
}
Run Code Online (Sandbox Code Playgroud)
先谢谢你
更新#1 - 试过这个,但它也不会改变XML: …