【问题标题】:Trouble Parsing XML解析 XML 时遇到问题
【发布时间】:2013-03-17 19:47:19
【问题描述】:

我在从 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);

但它会将&lt;status&gt;&lt;parameters&gt; 中的所有数据以一个大混乱的形式返回,而不是单独的值。

我很想序列化/反序列化,因为我正在进行的 XML 调用会为集群中的每个服务器返回上述内容,所以它可能是一个相当大的结果集,但我并不挑剔,我会很高兴能够将数据放入正确的变量中,以便我可以使用它们。

【问题讨论】:

  • 您需要从 XML 中得到什么?什么格式?
  • 我想收集参数、状态以及 ID 中的数据.. 我想将它们保持为本机格式,例如 isrelay 将是一个布尔值、端口是 int 等

标签: c# xml xml-parsing xml-serialization


【解决方案1】:

下面是一个以匿名类型存储一些元素的示例:

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),
            },
        });

您始终可以插入自己的具体类型并检查选项值可能在哪里。

【讨论】:

    【解决方案2】:

    xml.Descendants("status") 返回整个元素 status 及其子元素。如果要枚举它的元素,请使用以下代码:

    xml.Descendants("status").Descendants();
    

    【讨论】:

    • 这似乎工作得很好,但是如果我先在 foreach 循环中解析 ,然后解析 ,数据与正确的服务器不匹配,我仍然会留下,所以我需要同时解析 或者找到一种方法来通过
    • 我可以使用上面的示例将所有名称和值放入字典中,然后根据需要/想要提取数据吗?说使用 dict["ipaddress"] 或类似的东西?
    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    相关资源
    最近更新 更多