从XML文件中检索特定数据

时间:2014-12-05 13:42:48

标签: c# xml

使用LINQ to XML。

我有一个XML文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<TileMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Title>title</Title>
  <Abstract>Some clever text about this.</Abstract>
  <SRS>OSGEO:41001</SRS>
  <Profile>global-mercator or something</Profile>
</TileMap>

我可以使用这一小段代码从中检索<Title>而没有任何问题:

string xmlString = AppDomain.CurrentDomain.BaseDirectory + @"Capabilities\" + name + ".xml";
string xmlText = File.ReadAllText(xmlString);
byte[] buffer = Encoding.UTF8.GetBytes(xmlText);
XElement element = XElement.Load(xmlString);
IEnumerable<XElement> title =
                            from el in element.Elements("Title")
                            select el;
foreach (XElement el in title)
{
    var elementValue = el.Value;
}

但是,这并不是非常灵活,因为我说有一个XML文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RootObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Services>
    <TileMapService>
      <Title>title</Title>
      <href>http://localhost/root</href>
    </TileMapService>
  </Services>
</RootObject>

它无法找到<Title>,但它会找到<Services>(我推测),但因为它未被调用&#34;标题&#34;它只是忽略它。我在使用XML方面不是很强大。我将如何制作一个通过XML查看并提取我的方法&#34; Title&#34;或者你是否实现了这个?

3 个答案:

答案 0 :(得分:2)

您目前只是在查看根元素的子元素。

相反,如果您想查找所有后代,请使用Descendants

此外,使用from x in y select x的查询表达式没有任何意义(或者更确切地说,在某些情况下,非常有限的点,但不是这里)。所以只需使用:

var titles = element.Descendants("Title");

我个人实际上在这里使用XDocument而不是XElement - 毕竟你得到了一个完整的文档,完成了XML声明,而不是只是一个元素。

答案 1 :(得分:1)

将您的LINQ查询更改为:

IEnumerable<XElement> title =
    from el in element.Descendants("Title")
    select el;

Elements仅返回直接子节点,Descendants返回所有后代节点。

答案 2 :(得分:0)

后代将选择所有&#34;标题&#34;元素与级别无关。请使用xpath正确定位元素

using System;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;                 
using System.IO;

public class Program
{
    public static void Main()
    {
        string xmlFile = AppDomain.CurrentDomain.BaseDirectory + @"Capabilities\" + name + ".xml";
        XElement xml=XElement.Load(xmlFile);
        IEnumerable<XElement> titleElements = xml.XPathSelectElements("//Services/TileMapService/Title");
    }
}