Linq:当我在XML文件中有一个命名空间时,元素就不起作用了

本文关键字:命名空间 元素 不起作用 有一个 文件 XML Linq | 更新日期: 2023-09-27 17:57:50

我发现了一些使用xml到linq解析器的stackoverflow示例。我的xml有一个名称空间,所以我也尝试设置它(尽管我认为你可以从文件中读取它?)

无论如何,当我运行c#/linq代码时,它不会识别xml中的元素。除非我从xml文件中删除xmlns标记。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument document = XDocument.Load("C:''NewCredential.xml");    
            XNamespace ns = "http://myworld.org/CredCentral.xsd";
            var usernames = from r in document.Descendants(ns + "Credential")
                             select r.Element("Username").Value;
            foreach (var r in usernames)
            {
                Console.WriteLine(r.ToString());
            }
            Console.ReadLine();
        }
    }    
}    

<?xml version="1.0" encoding="utf-8" ?>
<CredCentral xmlns="http://myworld.org/CredCentral.xsd">
  <Credential>
    <CredentialId>123456789</CredentialId>    
    <Username>johnsmith</Username>
    <Password>password</Password>
  </Credential>
</CredCentral> 

如有任何帮助,我们将不胜感激。

Linq:当我在XML文件中有一个命名空间时,元素就不起作用了

您还需要指定带有元素名称的名称空间:

from r in document.Descendants(ns + "Credential")
select (string)r.Element(ns + "Username");

此外,我建议您使用显式强制转换,而不是使用Value属性,这将防止可能的异常。

您几乎做到了,您只需要在查询中为每个元素包含名称空间标识符。通过这种轻微的调整,您的代码可以工作:

var usernames = from r in doc.Descendants(ns + "Credential")
                select r.Element(ns + "Username").Value;