用c# XmlDocument (Unity3d)解析Amazon s3桶列表

本文关键字:Amazon s3 列表 解析 XmlDocument Unity3d | 更新日期: 2023-09-27 18:17:38

免责声明:这个问题发生在Unity应用程序中,但我敢肯定,这更像是c#问题,而不是Unity问题……

我试图使用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/");

我做错了什么?

谢谢!

用c# XmlDocument (Unity3d)解析Amazon s3桶列表

当您将名称空间添加到名称空间管理器中时,您需要给它一个非空的前缀。根据MSDN:

如果要使用XmlNamespaceManager以XPath (XML Path Language)表达式解析名称空间,则必须指定前缀。引用

必须在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);