2

尝试解析 XML 时出现引用无效令牌的异常

来自 url 的 html 响应:

<?xml version="1.0" encoding="UTF-8" ?>
<uclassify xmlns="http://api.uclassify.com/1/server/ResponseSchema" version="1.01">
    <status success="true" statusCode="2000"/>
    <readCalls>
        <classify id="Classify">
        <classification textCoverage="0.849057">
            <class className="negative" p="0.567908"/>
            <class className="positive" p="0.432092"/>
        </classification>
        </classify>
    </readCalls>
</uclassify>

代码:

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
var stream = myHttpWebResponse.GetResponseStream();
var reader = new StreamReader(stream);
string html = reader.ReadToEnd();
XmlDocument doc = new XmlDocument();
doc.LoadXml(html);
string negative = doc.SelectSingleNode("/uclassify/readCalls/classify/classification/class[1]@p").ToString();
string positive = doc.SelectSingleNode("/uclassify/readCalls/classify/classification/class[2]@p").ToString();

我真的不明白为什么它不起作用。任何帮助,将不胜感激。

4

2 回答 2

4

您的 xml 中有一个默认命名空间,这在 xpath 中是必需的。

XmlNamespaceManager oManager = new XmlNamespaceManager(new NameTable());
oManager.AddNamespace("ns", "http://api.uclassify.com/1/server/ResponseSchema");
doc.SelectSingleNode("/ns:uclassify/ns:readCalls/ns:classify/ns:classification/ns:class[1]/@p",oManager);

虽然我会使用 LINQ2XML

XDocument doc=XDocument.Load(stream);
var pList=doc.Descendants()
                   .Elements(x=>x.Name.LocalName=="class")
                   .Select(a=>
                         new
                         {
                            className=a.Attribute("className").Value,
                            p=a.Attribute("p").Value
                         });

您现在可以遍历 pList

foreach(var p in pList)
{
    p.className;
    p.p;
}
于 2013-09-24T13:26:15.360 回答
3

你不应该在某处声明命名空间吗?您获得的 XML 响应具有默认名称空间xmlns="http://api.uclassify.com/1/server/ResponseSchema"

还要确保在 XPath中添加一个/before :@p

/uclassify/readCalls/classify/classification/class[1]/@p
于 2013-09-24T13:24:47.067 回答