XML-C#通用方法,用于使用序列化对象上的键获取值
本文关键字:获取 对象 方法 用于 XML-C# 序列化 | 更新日期: 2023-09-27 18:01:02
我有一个xml
文件,如下所示。我想创建一个方法,使用键来获取值。
</cbn:Class>
<cbt:Students>
<cbt:Student>
<cbt:Key>x-param-key-studentName-1</cbt:Key>
<cbt:Value>x-param-studentSurname-val</cbt:Value>
</cbt:Student>
<cbt:Student>
<cbt:Key>x-param-key-studentName-2</cbt:Key>
<cbt:Value>x-param- studentSurname-val</cbt:Value>
</cbt:Student>
</cbt:Students>
</cbn:Class>
因此,我想使用studentName
作为密钥来获得studentSurname
的值。xml
是序列化的,因此我可以访问例如Student作为对象。我可以通过使用我写的如下代码来获得第一个学生的价值:
string studentSurname = myData.Class.Students.Student[0].Value;
其中myData
是序列化的对象。我想要一个更通用的方法,而不是只招收第一个学生
编辑:另一个XML
<?xml version="1.0" encoding="UTF-8"?>
<cbn:PaidOrderNotification xmlns:cbn="http://*/3.12.0.0/*.xsd">
<cbn:NotificationDate>2016-07-29T11:59:29.1137865Z</cbn:NotificationDate>
<cbn:Purchase cbt:Id="95233035" xmlns:cbt="http://xml.*.com/3.12.0.0/*.xsd">
<cbt:Status>Test Order</cbt:Status>
<cbt:StatusId>TST</cbt:StatusId>
<cbt:Items>
<cbt:Item cbt:RunningNo="1">
<cbt:ProductId>175358</cbt:ProductId>
<cbt:ProductReportingGroup>Basic alle Laufzeiten</cbt:ProductReportingGroup>
<cbt:YourCurrencyId>EUR</cbt:YourCurrencyId>
<cbt:ProfitCalculation>
<cbt:GrossRevenue>566.44</cbt:GrossRevenue>
</cbt:ProfitCalculation>
<cbt:YourPrice>
<cbt:TotalTotalPrice>
</cbt:TotalTotalPrice>
</cbt:YourPrice>
<cbt:Deliveries />
<cbt:Additionals />
<cbt:ExtraParameters />
</cbt:Item>
</cbt:Items>
<cbt:ExtraParameters>
<cbt:ExtraParameter>
<cbt:Key>x-my-key</cbt:Key>
<cbt:Value> x-my-val</cbt:Value>
</cbt:ExtraParameter>
</cbt:ExtraParameters>
</cbn:Purchase>
</cbn:PaidOrderNotification>
我想从这里得到这个值:
<cbt:ExtraParameters>
<cbt:ExtraParameter>
<cbt:Key>x-didi</cbt:Key>
<cbt:Value>sfsfd</cbt:Value>
</cbt:ExtraParameter>
</cbt:ExtraParameters>
我该怎么做?
您的XML文档有名称空间,但您的示例不包括它,我不得不伪造一些值吗。
一旦有了名称空间的URI,就可以使用XmlNamespaceManager
来查看带有适当限定符的文档
var xml = @"
<cbn:Class xmlns:cbn='something' xmlns:cbt='something-else'>
<cbt:StudentNr></cbt:StudentNr>
<cbt:Students>
<cbt:Student>
<cbt:Key>x-param-key-studentName-1</cbt:Key>
<cbt:Value>x-param-studentSurname-val</cbt:Value>
</cbt:Student>
<cbt:Student>
<cbt:Key>x-param-key-studentName-2</cbt:Key>
<cbt:Value>x-param- studentSurname-val</cbt:Value>
</cbt:Student>
</cbt:Students>
</cbn:Class>";
var doc = new XmlDocument();
doc.LoadXml(xml);
var students = doc.SelectSingleNode("//*[local-name() = 'Students']");
var nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("cbt", students.NamespaceURI);
var dictionary = students.SelectNodes("cbt:Student", nsmgr).OfType<XmlElement>()
.ToDictionary(student => student.SelectSingleNode("cbt:Key" , nsmgr).InnerText,
student => student.SelectSingleNode("cbt:Value", nsmgr).InnerText);
编辑:您也可以这样做:
string studentSurname = "";
var dictionary = myData.Class.Students.ToDictionary(student => student.Key,
student => student.Value);
var exists = dictionary.TryGetValue("x-param-key-studentName-1", out studentSurname);
EDIT2:请注意,您有两个不同的cbt:ExtraParameters
元素,第一个元素为空。我扩展了代码以使用任何cbt:ExtraParameter
元素
var doc = new XmlDocument();
doc.LoadXml(xml);
var dictionary = doc.SelectNodes("//*[local-name() = 'ExtraParameter']")
.OfType<XmlElement>()
.ToDictionary(
extra => extra.SelectSingleNode("*[local-name() = 'Key' ]").InnerText,
extra => extra.SelectSingleNode("*[local-name() = 'Value']").InnerText
);
var studentSurname = "";
var exists = dictionary.TryGetValue("x-my-key", out studentSurname);