我试图在这样的XML文档中找到节点:
<?xml version="1.0"?>
<TrainingCenterDatabase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2">
<Activities>
<Activity Sport="CyclingTransport">
<Id>2014-07-08T15:28:14Z</Id>
</Activity>
</Activities>
</TrainingCenterDatabase>
我的目标是使用如下代码提取节点值'Id‘:
XDocument doc = XDocument.Load(filePath);
List<string> urlList = doc.Root.Descendants("Id")
.Select(x => (string)x)
.ToList();
Console.WriteLine(urlList.Count);
然而,计数是0,在这里我期望1。
在调试和编辑XML之后,我注意到如果更改TrainingCenterDatabase
节点并移除以下属性:
<TrainingCenterDatabase>
然后,结果是按预期计算1。
因此,我的问题是,如何考虑名称空间,以便在TrainingCenterDatabase
节点具有这些属性时获得值?
发布于 2014-08-18 00:31:27
XML中的命名空间可能很棘手。我自己也遇到过很多次这个问题。在所有可能的情况下,以下将解决您的问题:
XDocument doc = XDocument.Load(filePath);
List<string> urlList = doc.Root.Descendants(doc.Root.Name.Namespace.GetName("Id"))
.Select(x => (string)x)
.ToList();
Console.WriteLine(urlList.Count);
基本上,这只是假设基础元素具有与根元素相同的名称空间。在这种情况下是这样的,但当然不一定是这样。
也许,正确的方法是明确地这样做。当然,这取决于你如何使用这个和你的数据源,所以自己做决定,但这需要做更多的事情:
XDocument doc = XDocument.Load(filePath);
List<string> urlList = doc.Root.Descendants(System.Xml.Linq.XName.Get("Id", "http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2"))
.Select(x => (string)x)
.ToList();
Console.WriteLine(urlList.Count);
造成问题的原因是,XElement
的默认行为(当没有给出显式命名空间时)是假定没有命名空间。但是,XML规范的默认行为是假定父名称空间。在你的例子中,这两个是不同的,所以它找不到后代。
发布于 2014-08-18 03:57:06
起作用了..。
XDocument doc = XDocument.Load(filePath);
XNamespace ns = "http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2";
var root = doc.Descendants(ns + "Id").Select(x => x.Value).ToList();
Console.WriteLine(root.Count);
https://stackoverflow.com/questions/25354893
复制相似问题