use*_*349 7 c# xml xmldocument xml-namespaces
我正在尝试使用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:
public void addXmlns()
{
string xml = @"<?xml version=""1.0""?>
<kml>
<Document>
<Placemark>
</Placemark>
</Document>
</kml>";
var xmldoc = new XmlDocument();
xmldoc.LoadXml(xml);
XmlSchema schema = new XmlSchema();
schema.Namespaces.Add("", "http://www.opengis.net/kml/2.2");
schema.Namespaces.Add("gx", "http://www.google.com/kml/ext/2.2");
schema.Namespaces.Add("kml", "http://www.opengis.net/kml/2.2");
schema.Namespaces.Add("atom", "http://www.w3.org/2005/Atom");
schema.Namespaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xmldoc.Schemas.Add(schema);
string message;
message = xmldoc.InnerXml;
MessageBox.Show(message); // still shows the original xml
}
Run Code Online (Sandbox Code Playgroud)
解决方案:这最终有效:
public void addXmlns()
{
string xml = @"<?xml version=""1.0""?>
<kml>
<Document>
<Placemark>
</Placemark>
</Document>
</kml>";
var xmldoc = new XmlDocument();
xmldoc.LoadXml(xml);
xmldoc.DocumentElement.SetAttribute("xmlns", "http://www.opengis.net/kml/2.2");
xmldoc.DocumentElement.SetAttribute("xmlns:gx", "http://www.google.com/kml/ext/2.2");
xmldoc.DocumentElement.SetAttribute("xmlns:kml", "http://www.opengis.net/kml/2.2");
xmldoc.DocumentElement.SetAttribute("xmlns:atom", "http://www.w3.org/2005/Atom");
xmldoc.DocumentElement.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
string message;
message = xmldoc.InnerXml;
MessageBox.Show(message); // shows the updated xml
}
Run Code Online (Sandbox Code Playgroud)