3

我已经在网上搜索了关于此的 linq 解决方案,但我找不到任何非常相似的解决方案。

谁能告诉我如何从下面的xml中选择comformation元素?我想在 c# 中使用 linq 将每个组件(id、accountnumber、type)添加到对象中。

实际上,我想一次获取一堆/记录中的数据,然后将其添加到列表中。我究竟做错了什么?

XML

string batch = @"
<batchresult>
      <outputs>
    <output>
      <value>
        <conformation>
          <component>
            <name>cmdinfo</name>
            <value>
              <bundle>
                <data>
                  <value>
                    <state>100</state>
                  </value>
                </data>
              </bundle>
            </value>
          </component>
          <component>
            <name>resultlist</name>
            <value>
              <bundle>
                <data>
                  <value>
                    <conformation>
                      <component>
                        <name>id</name>
                        <value>
                          <state>1</state>
                        </value>
                      </component>
                      <component>
                        <name>accountnumber</name>
                        <value>
                          <string>10505749</string>
                        </value>
                      </component>
                      <component>
                        <name>type</name>
                        <value>
                          <string>subnumber</string>
                        </value>
                      </component>
                    </conformation>
                  </value>
                  <value>
                    <conformation>
                      <component>
                        <name>id</name>
                        <value>
                          <state>2</state>
                        </value>
                      </component>
                      <component>
                        <name>accountnumber</name>
                        <value>
                          <string>53871265</string>
                        </value>
                      </component>
                      <component>
                        <name>type</name>
                        <value>
                          <string>subnumber</string>
                        </value>
                      </component>
                    </conformation>
                  </value>
                </data>
              </bundle>
            </value>
          </component>
          <component>
            <name>batchnumber</name>
            <value>
              <bundle>
                <data>
                  <value>
                    <state>14512367</state>
                  </value>
                </data>
              </bundle>
            </value>
          </component>
        </conformation>
      </value>
    </output>
  </outputs>
    </batchresult>";

代码

     class record
        {
            string F1 = "";
            public string f1
            {
                set { F1 = value; }
                get { return F1; }
            }

            string F2 = "";
            public string f2
            {
                set { F2 = value; }
                get { return F2; }
            }

            string F3 = "";
            public string f3
            {
                set { F3 = value; }
                get { return F3; }
            }
        }


    private void button1_Click(object sender, EventArgs e)
    {
            XDocument xmldoc = XDocument.Parse(batch);
            var obj = from o in xmldoc.Descendants("component")
                       where o.Parent.Name == "conformation"
    //select new record { f1 = o.Element("name").Value, f2 = o.Element("value").Value, f3 = o.Element("value").Value };

                       select new record { f1 = o.Element("id").Value, f2 = o.Element("accountnumber").Value, f3 = o.Element("type").Value };
            foreach (var d in obj)
            {
     record myobj = new record();
             myobj.f1=d.f1;//the first object will contain 1
             myobj.f2=d.f2; //10505749
             myobj.f3=d.f3;//subnumber .. and so on
             mylist.Add(myobj);
            }
    }

嗨,我没有尝试反序列化,我会检查一下。你们中的一个人使用此代码发布的示例:

XElement doc =  XElement.Parse(batch);
doc.Descendants("conformation").Elements("component").Select(x =>
new record
{
   f1 = x.First().Element("name").Value,
   f2 = x.Skip(1).First().Element("name").Value,
   f3 = x.Skip(2).Element("name").Value
};

..给我以下错误:

错误 15“System.Xml.Linq.XElement”不包含“First”的定义,并且找不到接受“System.Xml.Linq.XElement”类型的第一个参数的扩展方法“First”(您是否缺少使用指令还是程序集引用?)

怎么来的?

4

1 回答 1

0

尝试这个

XDocument doc = XDocument.Parse(batch);
var result = doc.
    XPathSelectElements("//component[name[text() = 'resultlist']]").
    Descendants("conformation").
    Select(y => new record
        {
            f1 = (string)y.XPathSelectElement("component[name[text() = 'id']]/value/state"),
            f2 = (string)y.XPathSelectElement("component[name[text() = 'accountnumber']]/value/string"),
            f3 = (string)y.XPathSelectElement("component[name[text() = 'type']]/value/string")
        }
    );

没有 XPath:

var result = doc.
    Descendants("conformation").
    Select(x => x.Elements("component")).
    Select(y => y.Select(z => new { name = (string)z.Element("name"), value = z.Element("value") })).
    Where(z => z.Any(m => m.name == "id")).
    Select(a => new record
        {
            f1 = (string)a.Where(m => m.name == "id").FirstOrDefault().value.Element("state"),
            f2 = (string)a.Where(m => m.name == "accountnumber").FirstOrDefault().value.Element("string"),
            f3 = (string)a.Where(m => m.name == "type").FirstOrDefault().value.Element("string")
        }
    );
于 2012-12-05T19:05:19.620 回答