C# 使用XmlNamespaceManager向XmlDocument添加名称空间
我正在尝试使用XmlNamespaceManager向XmlDocument添加名称空间。这是当前的xml:C# 使用XmlNamespaceManager向XmlDocument添加名称空间,c#,xml,xml-namespaces,xmldocument,C#,Xml,Xml Namespaces,Xmldocument,我正在尝试使用XmlNamespaceManager向XmlDocument添加名称空间。这是当前的xml: <?xml version="1.0"?> <kml> <Document> <Placemark> </Placemark> </Document> </kml> 我希望将其转换为此xml(使用XmlNamespaceManager): 但我无法更改xml。这是代码,我
<?xml version="1.0"?>
<kml>
<Document>
<Placemark>
</Placemark>
</Document>
</kml>
我希望将其转换为此xml(使用XmlNamespaceManager):
但我无法更改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
}
public void addXmlns()
{
字符串xml=@“
";
var xmldoc=新的XmlDocument();
LoadXml(xml);
XmlNamespaceManager nsmgr=新的XmlNamespaceManager(xmldoc.NameTable);
//添加名称空间
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");
字符串消息;
message=xmldoc.InnerXml;
MessageBox.Show(message);//仍显示原始xml
}
谢谢
更新#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
}
public void addXmlns()
{
字符串xml=@“
";
var xmldoc=新的XmlDocument();
LoadXml(xml);
XmlSchema=新的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);
字符串消息;
message=xmldoc.InnerXml;
MessageBox.Show(message);//仍显示原始xml
}
如果您对XML/XPath/XQuery有一定的了解,您将对这种行为感到满意
简言之,名称空间管理器用于XPath,具体为SelectNodes/SelectSingleNodes;它不用于生成XML
编辑:添加到manager实例的名称空间是一种告诉XPath在像/doc/mynamespace:mynode这样的查询字符串中,如何在各种上下文中解释和确定范围的方法。解决方案:这终于起作用了:
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
}
public void addXmlns()
{
字符串xml=@“
";
var xmldoc=新的XmlDocument();
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");
字符串消息;
message=xmldoc.InnerXml;
MessageBox.Show(message);//显示更新的xml
}
感谢您指出XmlNamespaceManager并非用于此目的。向已加载的现有XmlDocument添加名称空间的正确方法是什么?(不使用XSLT)查看此线程:感谢nim这么做!见上面的解决方案。我很好奇你是如何回避我遇到的问题的。。。当您使用默认名称空间(xmlns),然后添加另一个带后缀的名称空间(xmlns:gx)时,我得到以下错误:前缀“”无法从“”重新定义为“http://...'在同一开始元素标记内。
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
}