0

我正在尝试测试 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>
4

2 回答 2

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").

于 2013-05-22T13:02:38.527 回答
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);
}
于 2013-05-22T13:02:45.190 回答