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();

ただし、リストは常に空です。これは、おそらく値がなく、属性のみがあるためです。

編集:

現行版

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();

すべてのノードを選択するようにコードを少し変更しましたが、名前空間 variable を使用して呼び出しでclassyour の前に付けたことがわかります。"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. 属性の値pdouble.
于 2013-03-19T22:46:42.013 に答える