可能重复:
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");
答案 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;