Не могу получить доступ к XML с помощью Linq - PullRequest
1 голос
/ 09 декабря 2010

Я пытаюсь проанализировать следующий XML-файл, и ничего, что я делаю, не приводит ни к чему, кроме корня или первого узла.

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

Я пытаюсь получить список Сведения , чтобы я мог получить значения атрибутов, но все, что я пробовал, не приводит к данным. Моя последняя попытка это ...

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 имя: ноль Я: ложь 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 ]

1 голос
/ 09 декабря 2010

Вызов 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");
0 голосов
/ 09 декабря 2010
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);
        }
0 голосов
/ 09 декабря 2010
var xml= XDocument.Load(FileDetails.FullName);
var detailList = xml.Root.Decendants("Detail");

Это даст вам перечисляемую коллекцию XElements, которые являются всеми элементами Detail в XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...