2

.net 3.5 で Linq を使用して不正な形式であると思われる xml を解析しようとしています。xml からデータを取得し、データを変数に挿入する必要があります。xmldocument を使用して xml を解析しています。援助は大歓迎です

XML --

<?xml version="1.0" encoding="UTF-8"?>
<centovacast version="2.2.4" host="my.domain.com">
<response type="success">
<message>Complete</message>
<data><row>
<field name="mount">/stream</field>
<field name="listenercount">0</field>
<field name="genre">Unspecified</field>
<field name="url">http://</field>
<field name="title"></field>
<field name="currentsong">Placebo - One Of A Kind</field>
<field name="bitrate">128</field>
<field name="sourceconnected">1</field>
<field name="serverstate">1</field>
<field name="sourcestate">1</field>
<field name="reseller">0</field>
<field name="ipaddress"></field>
<field name="port">13282</field>
<field name="proxy">0</field>
<field name="servertype">ShoutCast</field>
<field name="sourcetype">icescc</field>
</row><row><field></field></row></data></response></centovacast>

もう 1 つの問題は、「currentsong」の値に ! などの特殊文字が含まれている場合があることです。、 % 、 ^ & など、xml で問題が発生することがあります。

-- XML を解析するために使用しようとしているコード

        XElement xml = XElement.Parse(data);

        var query = from p in xml.Elements("name")
                    select p;

        foreach (var record in query)
        {
            MessageBox.Show(String.Format("Info: {0} {1}",
                                                record.Element("url"),
                                                record.Element("title")));
        }
4

3 に答える 3

1

あなたのLINQは間違っています。という要素を探していますname。あなたはそれを持っていません。と呼ばれる要素がありますfield

ETA: わかりました。あなたの XML をよく見てきたので、これをやり直しています。

  var query = from r in xml.Elements("row") 
                select r; 

Attributes コレクションも確認する必要がありnameます。これが属性だからです。以下は記憶によるものですが、以下のようになります。

foreach(XElement row in query)
{
    var urlElement = row.Elements("field").Single(qe=>qe.HasAttributes && qe.Attribute("name").Value == "url");
    var titleElement = row.Elements("field").Single(qe => qe.HasAttributes && qe.Attribute("name").Value == "title");
    MessageBox.Show(String.Format("Info: {0} {1}", urlElement.Value, titleElement.Value));
}
于 2012-10-24T18:54:23.933 に答える
0

以下の Linq2Xml コードは、xml で動作します。

var xDoc = XDocument.Parse(xml); //XDocument.Load(filename)

var dict = xDoc.Descendants("field")
               .Where(e=>e.HasAttributes)
               .ToDictionary(e => e.Attribute("name").Value, e => e.Value);

Console.WriteLine(dict["currentsong"]);
于 2012-10-24T19:16:27.660 に答える
0

次のコードは、希望する方法で XML を解析します。XElement に特殊文字が含まれている場合、XML のロード中に例外をスローするという問題が発生する可能性があることに注意してください。文字列を解析する前に、これらの文字を適切にエスケープするために文字列を前処理することをお勧めします。空のフィールド要素を持つ 2 番目の行要素が気に入らないことにも注意してください。ソースからそのようなものを取得することが予想される場合は、エラー処理を記述して、それを見つけるか、例外をキャッチして行全体をダンプする必要があります。

提供された XML の形式は悪くありませんが、やや奇妙です。各フィールドの名前は、要素の属性ではなく、要素の名前でなければなりません。これにより、解析が少し難しくなります。これは Descendents を使用して他の要素をスキップし、ファイル内のすべての行要素を直接取得します。次に、Linq First メソッドを使用して、必要な属性値を持つ要素を見つけ、そこから要素値を取得します。

var query = from p in xml.Descendants("row")
                    select p;

foreach (var record in query)
{
    MessageBox.Show(String.Format("Info: {0} {1}",
        record.Elements().First(e => e.Attribute("name").Value.Equals("url")).Value,
        record.Elements().First(e => e.Attribute("name").Value.Equals("title")).Value));
}
于 2012-10-24T19:27:54.037 に答える