无法使用Linq访问XML

时间:2010-12-09 16:08:30

标签: xml linq linq-to-xml

我正在尝试解析以下XML文件,除了root或firstnode之外,我所做的任何事情都不会产生任何结果。

     <?xml version="1.0" encoding="utf-8" ?> 
     <Report {attributes}>
         <table1>
             <Detail_Collection>
                <Detail {attributes} />
                <Detail {attributes} />
                <Detail {attributes} />
             </Detail_Collection>
         </table1>
     </Report>

我正在尝试获取 Detail 的列表,以便我可以获取属性值,但我尝试的所有内容都没有数据。我最近的尝试就是这个......

var xml= XDocument.Load(FileDetails.FullName);
var xml1 = XDocument.Parse(xml.Root.FirstNode.ToString());
var xml3 = from e in custs.Root.Elements("Detail") select e;
var xml4 = from e in xml1.Elements("Detail") select e;

不同的尝试

var xml = XDocument.Load(FileDetails.FullName);
var root = xml.Root;
var els = root.Descendants("Detail");

以上显示在即时窗口中:

  

root.Descendants( “详细信息”)   {} System.Xml.Linq.XContainer.GetDescendants       name:null       自我:虚假       System.Collections.Generic.IEnumerator.Current:   空值       System.Collections.IEnumerator.Current:   空

问题在于报告元素中的属性:

<Report p1:schemaLocation="Info_x0020_Tickets_x0020_Entered http://domain/ReportServer?%2fInfo+Reporting%2fInfo+Tickets+Entered&rs%3aCommand=Render&rs%3aFormat=XML&rs%3aSessionID=vcvb0p452bb3na45havjes55&rc%3aSchema=True" Name="Info Tickets Entered" textbox9="1247" xmlns:p1="http://www.w3.org/2001/XMLSchema-instance" xmlns="Info_x0020_Tickets_x0020_Entered">

这是来自SQL Server报告服务器,我将不得不一个一个地删除并找到罪魁祸首。

这是此问题的最终解决方案 可能有更好的方法,但是一旦加载了数据,就无法轻易删除命名空间。

//load the original document
var xml = XDocument.Load(FileDetails.FullName);
//remove all the superflouos data attributes
xml.Root.RemoveAttributes();
//turn into a string
var content = xml.Root.ToString();
//remove the official namespace, there is no easy way to remove the namespace after document has been loaded, so we'll replace it
var newXmlContent = content.Replace("<Report xmlns=\"Info_x0020_Tickets_x0020_Entered\">", "<Report>");
//parse the updated string into a workable document
var newXml = XDocument.Parse(newXmlContent).Root;

这将返回一个可以正常处理的新XML文档。

3 个答案:

答案 0 :(得分:1)

调用custs.Root.Elements("Detail")将返回根(<Detail>)元素的直接子元素的所有<Report>个元素。

您需要致电Descendants

或者,您可以致电

custs.Root.Element("table1").Element("Detail_Collection").Elements("Detail")

编辑:您的元素可能位于命名空间中(根目录中为xmlns="...")。
您需要向XLINQ询问正确命名空间中的元素:

XNamespace ns = "Info_x0020_Tickets_x0020_Entered";
var els = root.Descendants(ns + "Detail");

答案 1 :(得分:0)

var xml= XDocument.Load(FileDetails.FullName);
var detailList = xml.Root.Decendants("Detail");

这将为您提供可枚举的XElements集合,这些集合是XML中的所有Detail元素。

答案 2 :(得分:0)

string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?> 
 <Report foo=""bar"">
     <table1>
         <Detail_Collection>
            <Detail foo=""bar"" />
            <Detail foo=""bar"" />
            <Detail foo=""bar"" />
         </Detail_Collection>
     </table1>
 </Report>";

        var doc = XDocument.Parse(xml);
        foreach (var desc in doc.Root.Descendants("Detail"))
        {
            Console.WriteLine(desc.Attribute("foo").Value);
        }