1

centovacast v3 XML API から一部の XML を解析する際に問題が発生しています。私は彼らの 2.x API を使用して解析しましたが、応答が完全に変更されており、既存のパーサーを機能させることができないようです。私が試したすべての例では、データを正しく取得できないようです。

私は.NET 3.5を使用しています(4.0も受け入れられます)。例を教えていただければ幸いです。

XML ドキュメントの例は次のとおりです。

<?xml version=""1.0"" encoding=""UTF-8""?>
<centovacast version=""3.0.0"" host=""0.0.0.0:2199"">
    <response type=""success"">
        <message>OK</message>
        <data>
            <row>
                <id>1</id>
                <parameters>
                    <ipaddress>127.0.0.1</ipaddress>
                    <port>2198</port>
                    <title>Local server</title>
                    <isrelay>1</isrelay>
                    <ismaster>1</ismaster>
                    <defaultip>0.0.0.0</defaultip>
                    <daemontype>RPC</daemontype>
                    <hostname/>
                </parameters>
                <status>
                    <memfree>101879808</memfree>
                    <memtotal>1073741824</memtotal>
                    <memavail>778653696</memavail>
                    <swapfree>1077501952</swapfree>
                    <swaptotal>1077501952</swaptotal>
                    <buffers>172535808</buffers>
                    <cpuload>0.00</cpuload>
                    <uptime>13372713</uptime>
                    <machine>Intel(R) Xeon(R) CPU E5620</machine>
                    <osbrief>Linux</osbrief>
                    <osdetails>2.6.18</osdetails>
                    <other>
                        <Processes>
                            <field>n</field>
                            <field>72</field>
                        </Processes>
                        <Kernel>
                            <field>s</field>
                            <field>Linux version 2.6.18</field>
                        </Kernel>
                        <row>
                            <field>f</field>
                            <field>0.000000</field>
                        </row>
                        <row>
                            <field>f</field>
                            <field>0.000000</field>
                        </row>
                        <row>
                            <field>f</field>
                            <field>0.000000</field>
                        </row>
                    </other>
                    <online>1</online>
                </status>
                <accounts>
                    <licensed>-1</licensed>
                    <active>1</active>
                    <inactive>0</inactive>
                </accounts>
            </row>
        </data>
    </response>
</centovacast>

次のコードを使用してみました。

        var xml = XDocument.Parse(xmldata);
        var query = from p in xml.Descendants("status")
                    select p;
        foreach (var record in query)
            MessageBox.Show(record.Value);

<status>ただし、 and内のすべてのデータを<parameters>、個別の値ではなく、1 つの大きな寄せ集めで返します。

私が行っているXML呼び出しはクラスター内の各サーバーに対して上記を返すため、シリアライズ/デシリアライズしたいので、結果セットが非常に大きくなる可能性がありますが、うるさいわけではありません。正しい変数にデータを取得して、それらを使用できるようにします。

4

2 に答える 2

0

xml.Descendants("status")要素全体statusとその子要素を返します。その要素を列挙する場合は、次のコードを使用します。

xml.Descendants("status").Descendants();
于 2013-03-17T20:42:54.830 に答える
0

いくつかの要素を匿名型に格納する例を次に示します。

var data =
    XDocument.Parse(xml)
    .Root
    .Element("response")
    .Element("data")
    .Elements("row")
    .Select(row =>
        new
        {
            Id = Int32.Parse(row.Element("id").Value),
            Parameters = new
            {
                IpAddress = row.Element("parameters").Element("ipaddress").Value,
                port = Int32.Parse(row.Element("parameters").Element("port").Value),
            },
            Status = new
            {
                MemFree = Int32.Parse(row.Element("status").Element("memfree").Value),
            },
        });

オプション値が存在する可能性のある独自の具象型と null チェックをいつでもプラグインできます。

于 2013-03-17T20:49:36.607 に答える