Linq To Xml Search XML without knowing the exact structure
How would I parse the following to get the sql message .Net SqlClient Data Provider?
I'm trying to do it with Linq to xml but I'm not having much luck. The xml is recursive so I cant be certain what level the message will appear at
Any ideas?
Thanks
<detail>
<ErrorCode xmlns="http://www.microsoft.com/sql/reportingservices">rsProcessingAborted</ErrorCode>
<HttpStatus xmlns="http://www.microsoft.com/sql/reportingservices">400</HttpStatus>
<Message xmlns="http://www.microsoft.com/sql/reportingservices">An error has occurred during report processing.</Message>
<HelpLink xmlns="http://www.microsoft.com/sql/reportingservices">http://go.microsoft.com/fwlink/?LinkId=20476&EvtSrc=Microsoft.ReportingServices.Diagnostics.Utilities.ErrorStrings&EvtID=rsProcessingAborted&ProdName=Microsoft%20SQL%20Server%20Reporting%20Services&ProdVer=10.50.1600.1</HelpLink>
<ProductName xmlns="http://www.microsoft.com/sql/reportingservices">Microsoft SQL Server Reporting Services</ProductName>
<ProductVersion xmlns="http://www.microsoft.com/sql/reportingservices">10.50.1600.1</ProductVersion>
<ProductLocaleId xmlns="http://www.microsoft.com/sql/reportingservices">1033</ProductLocaleId>
<OperatingSystem xmlns="http://www.microsoft.com/sql/reportingservices">OsIndependent</OperatingSystem>
<CountryLocaleId xmlns="http://www.microsoft.com/sql/reportingservices">1033</CountryLocaleId>
<MoreInformation xmlns="http://www.microsoft.com/sql/reportingservices">
<Source>Microsoft.ReportingServices.ProcessingCore</Source>
<Message msrs:ErrorCode="rsProcessingAborted" msrs:HelpLink="http://go.microsoft.com/fwlink/?LinkId=20476&EvtSrc=Microsoft.ReportingServices.Diagnostics.Utilities.ErrorStrings&EvtID=rsProcessingAborted&ProdName=Microsoft%20SQL%20Server%20Reporting%20Services&ProdVer=10.50.1600.1" xmlns:msrs="http://www.microsoft.com/sql/reportingservices">An error has occurred during report processing.</Message>
<MoreInformation>
<Source>Microsoft.ReportingServices.ProcessingCore</Source>
<Message msrs:ErrorCode="rsErrorReadingNextDataRow" msrs:HelpLink="http://go.microsoft.com/fwlink/?LinkId=20476&EvtSrc=Microsoft.ReportingServices.Diagnostics.Utilities.ErrorStrings&EvtID=rsErrorReadingNextDataRow&ProdName=Microsoft%20SQL%20Server%20Reporting%开发者_Go百科20Services&ProdVer=10.50.1600.1" xmlns:msrs="http://www.microsoft.com/sql/reportingservices">Cannot read the next data row for the dataset DD_Inventory.</Message>
<MoreInformation>
<Source>.Net SqlClient Data Provider</Source>
<Message>Conversion failed when converting the nvarchar value 'h' to data type int.</Message>
</MoreInformation>
</MoreInformation>
</MoreInformation>
<Warnings xmlns="http://www.microsoft.com/sql/reportingservices" />
</detail>
var doc = XDocument.Parse(xml);
XNamespace ns = "http://www.microsoft.com/sql/reportingservices";
string message = (from info in doc.Descendants(ns + "MoreInformation")
where info.Element(ns + "MoreInformation") == null
select (string)info.Element(ns + "Message")).Single();
Take all elements in the whole document with the name MoreInformation
, take only those that don't have any more MoreInformation
nested inside them. For them, select the message. Finally, make sure there is only one result.
精彩评论