[英]Getting XML data from attributes in C#
我有一个以 XML 格式返回数据的 API。 XML 的相关部分如下所示:
<data name="Rows">
<data Name="Row">
<data name="CONTACT">John Smith</data>
<data name="PHONE1">(555)123-4567</data>
</data>
<data Name="Row">
<data name="CONTACT">Jim Smith</data>
<data name="PHONE1">(555)123-6754</data>
</data>
</data>
我可以通过以下方式获取每行的节点集合:
var query = from item in xdoc.Root.Descendants("data")
where (string)item.Attribute("Name") == "Row"
select item;
如果我按属性过滤,则每个元素的字符串集合:
var query2 = from item in query.Elements("data")
where (string)item.Attribute("name") == "CONTACT"
select item;
returns: John Smith, James Smith
但我不知道如何将每个联系人姓名和电话号码放在一起。
就像是:
foreach(var row in query)
{
contact = query.???;
phone1 = query.????;
}
您需要使用第一个查询来获取行元素的集合。 然后对于每个元素,您需要查找具有所需属性的子元素:
// Find all elements <data Name="Row">
var query = from item in xdoc.Root.Descendants("data")
where (string)item.Attribute("Name") == "Row"
select item;
// Loop through the elements
foreach(var row in query)
{
// find child element, that has attribute Name="CONTACT"
var contactElement = row.Descendants("data")
.Where(x=>(string)x.Attribute("Name") == "CONTACT")
.First();
// find child element, that has attribute Name="PHONE1"
var phoneElement = row.Descendants("data")
.Where(x=>(string)x.Attribute("Name") == "PHONE1")
.First();
// get values of found elements
var contact = contactElement.Value;
var phone1 = phoneElement.Value;
}
上面的代码假设您将始终拥有所有元素,因此使用函数First()
。 如果某些元素可能丢失,您需要相应地处理。
由于在您的 XML 中所有节点都是data
,因此使用 Descedants 可能会导致意外结果,因为无论节点在哪里,它都会找到所有节点。 我会一步一步来:-
1)从根节点使用xdoc.Root.Elements("data")
找到所有元素,这将为您提供两个属性Name
作为Row
节点。
2) 现在从步骤 1 中检索到的集合中,找到name
属性为CONTACT
或PHONE1
的第一个data
。
3) 只需投影步骤 2 中检索到的项目。
var res = from item in xdoc.Root.Elements("data")
let ContactRow = item.Elements("data")
.FirstOrDefault(x => (string)x.Attribute("name") == "CONTACT")
let PHONE1Row = item.Elements("data")
.FirstOrDefault(x => (string)x.Attribute("name") == "PHONE1")
select new
{
Contact = (string)ContactRow,
Phone1 = (string)PHONE1Row
};
或使用方法语法:-
var result = xdoc.Root.Elements("data")
.Select(x =>
{
var ContactRow = x.Elements("data")
.FirstOrDefault(z => (string)z.Attribute("name") == "CONTACT");
var PHONE1Row = x.Elements("data")
.FirstOrDefault(z => (string)z.Attribute("name") == "PHONE1");
return new
{
Contact = (string)ContactRow,
Phone1 = (string)PHONE1Row
};
});
或者试试这个
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string xml =
"<data name=\"Rows\">" +
"<data Name=\"Row\">" +
"<data name=\"CONTACT\">John Smith</data>" +
"<data name=\"PHONE1\">(555)123-4567</data>" +
"</data>" +
"<data Name=\"Row\">" +
"<data name=\"CONTACT\">Jim Smith</data>" +
"<data name=\"PHONE1\">(555)123-6754</data>" +
"</data>" +
"</data>";
XElement doc = XElement.Parse(xml);
var results = doc.Descendants().Where(x => (string)x.Attribute("Name") == "Row").Select(x => new {
contact = x.Elements().Where(y => (string)y.Attribute("name") == "CONTACT").FirstOrDefault().Value,
phone = x.Elements().Where(y => (string)y.Attribute("name") == "PHONE1").FirstOrDefault().Value,
}).ToList();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.