1

免責事項: この問題は Unity アプリケーション内で発生していますが、私の知る限り、これは Unity の問題というよりも C# の問題です...

System.Xml.XmlDocumentを使用して Amazon S3 バケット リストを解析しようとしています。これが私のバケット xmlです。C# Xml チュートリアルで見つけた例を使用しています。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("http://rss.cnn.com/rss/edition_world.rss");
XmlNode titleNode = xmlDoc.SelectSingleNode("//rss/channel/title");
if(titleNode != null)
    Debug.Log(titleNode.InnerText); 

これはその特定の XML ファイルでは問題なく機能しますが、自分のものをそこに入れると、次のようになります。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("https://s3.amazonaws.com/themall/");
Debug.Log ( xmlDoc.InnerXml );
XmlNode nameNode = xmlDoc.SelectSingleNode("//Name");
if(nameNode != null)
    Debug.Log(nameNode.InnerText); 

コンソールに未加工の XML が表示されるので、正常にダウンロードされていることがわかりますが、最も単純な XPath でさえ結果が得られません!

私の唯一の理論は、おそらくそれが私の XML のデフォルトの名前空間と関係があるということですか? どういうわけかそれについて XmlDocument に伝える必要がありますか? ここに私のルートタグがあります:

<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">

XmlNamespaceManager を作成し、「SelectSingleNode」へのすべての呼び出しでそれを使用しようとしましたが、それもうまくいかないようです。

XPathNavigator nav = xmlDoc.CreateNavigator();
XmlNamespaceManager ns = new XmlNamespaceManager(nav.NameTable);
ns.AddNamespace(System.String.Empty, "http://s3.amazonaws.com/doc/2006-03-01/");

私は何を間違っていますか?

ありがとう!

4

1 に答える 1

1

名前空間を名前空間マネージャーに追加するときは、空でないプレフィックスを付ける必要があります。MSDNによると:

XmlNamespaceManager を使用して XML パス言語 (XPath) 式の名前空間を解決する場合は、プレフィックスを指定する必要があります。引用符

次に、プレフィックスを XPath 選択ステートメントで使用する必要があります。これが私が使用したコードで、出力は予想どおり「themall」でした:

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load("http://s3.amazonaws.com/themall/");

        XmlNamespaceManager namespaceManager =
            new XmlNamespaceManager(xmlDoc.NameTable);
        namespaceManager.AddNamespace("ns",
            "http://s3.amazonaws.com/doc/2006-03-01/");

        XmlNode titleNode =
            xmlDoc.SelectSingleNode("//ns:Name", namespaceManager);
        if (titleNode != null)
            Console.WriteLine(titleNode.InnerText);
于 2013-06-09T03:59:53.637 に答える