Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XmlNamespaceManager向XmlDocument添加名称空间_C#_Xml_Xml Namespaces_Xmldocument - Fatal编程技术网

C# 使用XmlNamespaceManager向XmlDocument添加名称空间

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。这是代码,我

我正在尝试使用XmlNamespaceManager向XmlDocument添加名称空间。这是当前的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  
}