为什么我不能阅读XML

时间:2013-01-31 08:26:00

标签: c# xml linq-to-xml

  

可能重复:
  Why XDocument can’t get element out of this wellform XML text?

我正在尝试使用linq读取xml到xml,我想我理解错了。 这是xml的开始(它很长,所以我不发布所有内容)

<?xml version="1.0" encoding="utf-8"?>
   <Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
      <Body>
         <ReportItems>
             <Tablix Name="Tablix12">
              ......
              ......
             </Tablix>

这个xml可能有一些“Tablix”元素,可能有1个或没有,对于其中每一个我想读取这个标签里面的内容,我很难开始。

我尝试过几种方法来获取“Tablix”元素或任何其他元素。 在这段代码中,我只得到“var root”的结果,其余的总是为null,我不明白我做错了什么。

    public ReadTablixResponse ReadTablixAdvanced(string rdl)
    {
        XDocument xml = XDocument.Parse(rdl);

        var root = xml.Root;
        var Body = xml.Root.Element("Body");
        var report = xml.Root.Element("Report");
        var aa = xml.Element("Report");
        var bb = xml.Element("Body");
        var test = xml.Elements("Tablix");

2 个答案:

答案 0 :(得分:2)

我注意到的一件事是你使用了方法Element("name")。它将始终尝试使用指定的XName重新启动第一个(按文档顺序)直接子元素。这就是为什么你有 null

如果你想返回更深层的元素(从你看的地方)。你需要使用Descendants(“name”)方法,它将返回所有后代元素的集合。无论它们有多深(相对于你选择的锚)......

例如:

 XNamespace xNameSpace = "http://schemas.micro.....";
 // ...
 var tablixes= xml.Descendants(xNameSpace + "Tablix");

然后你可以通过:

foreach (var tablix in tablixes)
{
    var name=(string)tablix.Attribute("Name");
    var age=(int)tablix.Element("age");
   ...

}

答案 1 :(得分:1)

        XDocument xDocument = XDocument.Parse(rdl);
        XNamespace xNameSpace = "http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition";
        var tablixes= from o in xDocument.Descendants(xNameSpace + "Tablix")
                    select o.Value;