gpt4 book ai didi

c# - 从 xml 中选择作为 linq 中的记录

转载 作者:数据小太阳 更新时间:2023-10-29 02:45:52 26 4
gpt4 key购买 nike

我在网上搜索了这方面的 linq 解决方案,但找不到任何非常相似的解决方案。

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

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

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”(是您是否缺少 using 指令或程序集引用?)

怎么会呢?

最佳答案

试试这个

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

关于c# - 从 xml 中选择作为 linq 中的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13497392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com