我正在尝试测试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>
答案 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);
}