2013-12-18 24 views
6

XmlNamespaceManagerを使用してXmlDocumentに名前空間を追加しようとしています。これは現在のxmlです:XmlNamespaceManagerを使用してXmlDocumentに名前空間を追加する

<?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を変更することはできませんよ。

<?xml version="1.0"?> 
<kml> 
    <Document> 
    <Placemark> 
    </Placemark> 
    </Document> 
</kml> 

私はそれが(てXmlNamespaceManagerを使用して)この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 

     } 
: - これを試みたが、それはまた、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:ここでのコードは、私はそれが簡単に修正する必要があります知っている、あります

答えて

6

ソリューション:これは最終的に働いた:てXmlNamespaceManagerは、この目的のために意図されていないことを指摘し

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 
} 
+0

デフォルトの名前空間(xmlns)を使用して別の接尾辞付き名前空間(xmlns:gx)を追加すると、次のエラーが発生します。 '接頭辞 ''を同じ開始要素タグ内の ''から 'http:// ...'に再定義することはできません。 – shortstuffsushi

2

XML/XPath/XQueryに関する知識があれば、この動作に慣れることができます。つまり、ネームスペースマネージャはXPath、SelectNodes/SelectSingleNodes専用です。 XMLを生成することを目的としたではなく、です。

EDIT:マネージャインスタンスに追加された名前空間は、この/ doc/mynamespace:mynodeのようなクエリ文字列で、さまざまなコンテキストでの説明とスコープをXPathに伝える方法です。

+0

感謝を。既に読み込まれている既存のXmlDocumentに名前空間を追加する正しい方法は何ですか? (XSLTを使用しないで) – user3062349

+0

このスレッドを参照してください:http://stackoverflow.com/questions/2920142/how-to-add-xmlnamespace-to-a-xmldocument – nim

+0

ありがとうございました!上記の解決策を参照してください。 – user3062349

関連する問題