1

免责声明:这个问题发生在 Unity 应用程序中,但是 AFAIK,这更像是 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/");

我究竟做错了什么?

谢谢!

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 回答