3

我有这个 XML

<?xml version="1.0" encoding="UTF-8" ?>
<uclassify xmlns="http://api.uclassify.com/1/ResponseSchema" version="1.01">
  <status success="true" statusCode="2000"/>
  <readCalls>
    <classify id="cls1">
      <classification textCoverage="1">
        <class className="female" p="0.932408"/>
        <class className="male" p="0.0675915"/>
      </classification>
    </classify>
  </readCalls>
</uclassify>

或类似的。重要的是,我没有

<tag>value</tag> 

<tag attribute1 attribute2 ... />. 

我想输出的是例如

属性1:属性值1

所以我想输入一个像“女性”这样的词,我希望它输出 0.932408。

我试图开始的事情

string xml = HttpGet("http://uclassify.com/browse/" + username + "/" + classifiername + "/" + operation + "?" + paramz.ToString());
XDocument doc = XDocument.Parse(xml);
var list = doc.Root.Elements("uclassify")
               .Select(element => element.Value)
               .ToList();

但是list总是空的,大概是因为没有值,只有属性。

编辑:

当前版本

string xml = HttpGet("http://uclassify.com/browse/" + username + "/" + classifiername + "/" + operation + "?" + paramz.ToString());
XDocument doc = XDocument.Parse(xml);
XNamespace ns = "http://api.uclassify.com/1/ResponseSchema";
var list = doc.Root.Descendants(ns + "class")
                .Select(element => element.Value)
                .ToList();
textBox1.Text = string.Join(",", list.ToArray());

结果是一个逗号。

4

1 回答 1

4

所以你的问题是默认命名空间:

xmlns="http://api.uclassify.com/1/ResponseSchema"

要修复它,您需要限定元素选择器。

你可以这样做......

XNamespace ns = "http://api.uclassify.com/1/ResponseSchema";
var list = doc.Root.Descendants(ns + "class")
                .Select(element => element.Value)
                .ToList();

我稍微修改了您的代码以选择所有class节点,但您可以看到我"class"Descendants()调用中使用命名空间变量为您添加了前缀ns

编辑:所以现在你的问题是你正在选择元素的值,而不是属性值......

因此,如果我们正在为属性值构建属性名称字典,您可能需要使用如下代码:

Dictionary<string,double> dictionary = doc.Root.Descendants(ns + "class")
                .ToDictionary(
                    element => element.Attribute("className").Value,
                    element => double.Parse(element.Attribute("p").Value));

foreach(var item in dictionary)
{
    Console.WriteLine(string.Format("{0}: {1}", item.Key, item.Value));
}

所以有几点需要注意:

  1. 我假设className属性中的每个class属性都是唯一的,否则你会有一个例外
  2. 我假设属性的p值为 a double
于 2013-03-19T22:46:42.013 回答