使用XmlNamespaceManager向XmlDocument添加命名空间

7
我将尝试使用XmlNamespaceManager向XmlDocument添加命名空间。这是当前的XML代码:
<?xml version="1.0"?>
<kml>
  <Document>
    <Placemark>
    </Placemark>
  </Document>
</kml>

我希望它能转换为这个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>

但我无法更改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

        }

感谢您的提前帮助。

更新 #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

        }
2个回答

8

解决方案:最终,这个方法起作用:

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  
}

1
我很好奇你是如何解决我遇到的问题的... 当你使用默认命名空间(xmlns)然后添加另一个带有后缀的命名空间(xmlns:gx)时,我会收到以下错误:The prefix '' cannot be redefined from '' to 'http://...' within the same start element tag. - shortstuffsushi

2
如果您了解XML/XPath/XQuery的一些知识,您将会对这种行为感到舒适。
简而言之,命名空间管理器是用于XPath,SelectNodes/SelectSingleNodes的特定功能;它不是用于生成XML。
编辑:向管理器实例添加的命名空间是一种告诉XPath如何在像这样的查询字符串中解释和作用于各种上下文中的/doc/mynamespace:mynode。

谢谢指出XmlNamespaceManager不适用于此目的。那么在已加载现有XmlDocument中添加命名空间的正确方法是什么?(不使用XSLT) - user3062349
请查看此线程:https://dev59.com/3nE85IYBdhLWcg3wJQCt - nim
谢谢nim,解决了!请参见上面的解决方案。 - user3062349

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接