从XML文档

时间:2017-01-31 11:49:43

标签: c# xml

我想从特定的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");

3 个答案:

答案 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;

有点长,但更容易阅读。