【问题标题】:Find value in XML and output it在 XML 中查找值并输出
【发布时间】:2013-03-19 22:36:05
【问题描述】:

我有这个 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());

结果是逗号。

【问题讨论】:

标签: c#


【解决方案1】:

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

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 节点,但您可以看到我在 Descendants() 调用中使用命名空间变量 ns 为您的 "class" 添加了前缀。

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

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

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. 我假设class属性中的每个className属性都是唯一的,否则你会有一个例外
  2. 我假设属性p 的值是double

【讨论】:

  • @PeterWeter 我看不到 pastebin(工作限制),用您的代码编辑您的原始问题! :)
  • 现在很好用。但它不是双倍的,你的输出是 932408 而不是 0.932408
猜你喜欢
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
相关资源
最近更新 更多