使用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;或者你是否实现了这个?
答案 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");
}
}