C#Xelement无法检索元素

时间:2013-05-22 12:55:50

标签: c# .net xml linq

我正在尝试测试Linq以检索xml文件中的某些元素值:

以下是代码:

  try
        {
            XElement doc = XElement.Load(@"Z:\test.xml");

            string abc, def;


            foreach (XElement elm in doc.Descendants().Elements("test"))
            {
                abc = elm.Element("att").Value;
                def = elm.Element("title").Value;
                Console.WriteLine(abc);
                Console.WriteLine(def);
            }
        }

        catch (XmlException xe)
        {
            Console.WriteLine(xe);
        }

但这似乎没有经过foreach循环。它没有给我任何错误。我调试了它,它读取xml文件就好了。但是当它到达foreach循环时,它就会退出。是什么原因。

我的XML文件的一部分:

<root xmlns:xsi="w3.org/2001/XMLSchema-instance"; xsi:noNamespaceSchemaLocation="test.xsd">
<test att="123" title="XXXX" />
<test att="2324" title="YYYY" />
</root>

2 个答案:

答案 0 :(得分:1)

首先我们必须注意

foreach (XElement elm in doc.Descendants().Elements("test"))

只会找到不是根的元素,而不是根的直接子元素,但至少会降低2级;这是必须成为根的后代的子元素。那么:你的元素至少要降低2级吗?如果不是:


因为你说它加载,这可能是命名空间问题。我猜你有类似的东西:

<foo xmlns="blahblahblah">
    ...
    <test>...</test>
</foo>

<bar:foo xmlns:bar="blahblahblah">
    ...
    <test>...</test>
</bar:foo>

在这种情况下,这些元素的名称不是test,而是blahblahblah:test。要进行查询,您需要使用完整的XName

具体例子:

string text = @"<foo xmlns=""blah""><test/></foo>";
var doc = XDocument.Parse(text);
var el0 = doc.Root.Element("test"); // null
XNamespace ns = "blah";
var el1 = doc.Root.Element(ns + "test"); // not null

显然,您需要在代码中使用正确的命名空间,然后.Elements(ns + "test")

答案 1 :(得分:1)

首先,您需要拥有单个根元素,否则会抛出异常:

<testRoot>
    <test att="123" title="XXXX" />
    <test att="2324" title="YYYY" />
</testRoot>

代码应如下所示:

//Not XElement but XDocument
XDocument doc = XDocument.Load(@"D:\test\test.xml");

string abc, def;

foreach (XElement elm in doc.Descendants().Elements("test"))
{
    //Not elm.Element but elm.Attribute
    abc = elm.Attribute("att").Value;
    def = elm.Attribute("title").Value;
    Console.WriteLine(abc);
    Console.WriteLine(def);
}