我想从特定的XML格式获取数据。 XML文档看起来像这样:
<MyXML>
<Sources>
<S1>www.example1.org</S1>
<S2>www.example2.org</S2>
</Sources>
<Books>
<Book id="1">
<Datas>
<Data name="Book_1_Name" tag="1111" />
<Data name="Book_2_Name" tag="2222" />
</Datas>
</Book >
<Book id="2">
<Datas>
<Data name="Book_1_Name" tag="3333" />
<Data name="Book_2_Name" tag="4444" />
</Datas>
</Book >
</Books>
我的问题是: 如果我知道S1,我怎样才能获得 www.example1.org ? 如何搜索&#34; Book_1_name &#34;来自Book id = 1?
我正在使用C#和XDocument这样:
XDocument.Load(_XML_path);
var node = _configXml.XPathSelectElement("MyXML/Books/Datas");
答案 0 :(得分:0)
您应该将XML映射到C#对象。然后,您可以使用以下内容获得所需内容:
XmlSerializer serializer = new XmlSerializer(typeof(MyXML));
var xml = (MyXML)serializer.Deserialize(new StringReader(XDocument.Load(_XML_path)));
var s1 = xml.Sources.S1;
答案 1 :(得分:0)
您可以使用XPath
,关于XPath
,请参阅:http://www.xfront.com/xpath/
var _configXml = XDocument.Load(_XML_path);
//how to get S1 element.
var s1 = _configXml.XPathSelectElement("MyXML/Sources/S1");
//how search
var search = _configXml.XPathSelectElements("//Book[@id='1']//Data[@name='Book_1_Name']");
Console.WriteLine(s1.Value);
Console.WriteLine(search.First().Attribute("tag").Value);
答案 2 :(得分:0)
如果您希望坚持使用XDocument
,则可以执行以下操作
var books = doc.Element("MyXML").Element("Books");
var bookById = books.Elements("Book")
.Where(b => b.Attribute("id").Value == "1")
.Select(b => b.Element("Datas"));
在第一行中,您正在选择Books
节点(请注意,在实际情况中,我在此处添加一些检查)。在以下行中,您首先获取所有Book
个子元素(books.Elements("Book")
),检查它们您要搜索的ID(Where(b => b.Attribute("id").Value == "1")
),然后从相应的数据节点中选择数据节点书。您可以将其重写为查询语法
var bookById = from book in books.Elements("Book")
let id = book.Attribute("id")
let datas = book.Element("Datas")
where id != null
&& datas != null
&& id.Value == "1"
select datas;
有点长,但更容易阅读。