首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将LINQ与命名空间一起使用

将LINQ与命名空间一起使用
EN

Stack Overflow用户
提问于 2014-08-18 00:25:24
回答 2查看 587关注 0票数 4

我试图在这样的XML文档中找到节点:

代码语言:javascript
运行
复制
<?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‘:

代码语言:javascript
运行
复制
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节点并移除以下属性:

代码语言:javascript
运行
复制
<TrainingCenterDatabase>

然后,结果是按预期计算1。

因此,我的问题是,如何考虑名称空间,以便在TrainingCenterDatabase节点具有这些属性时获得值?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-18 00:31:27

XML中的命名空间可能很棘手。我自己也遇到过很多次这个问题。在所有可能的情况下,以下将解决您的问题:

代码语言:javascript
运行
复制
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);

基本上,这只是假设基础元素具有与根元素相同的名称空间。在这种情况下是这样的,但当然不一定是这样。

也许,正确的方法是明确地这样做。当然,这取决于你如何使用这个和你的数据源,所以自己做决定,但这需要做更多的事情:

代码语言:javascript
运行
复制
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规范的默认行为是假定父名称空间。在你的例子中,这两个是不同的,所以它找不到后代。

票数 5
EN

Stack Overflow用户

发布于 2014-08-18 03:57:06

起作用了..。

代码语言:javascript
运行
复制
        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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25354893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档