2010-12-09 2 views
1

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

 <?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"); 

Вышеприведенные отображается в окне Immediate:

root.Descendants ("Detail") {System .Xml.Linq.XContainer.GetDescendants} имя: null self: false 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 Reporting 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-документ, который можно обрабатывать в обычном режиме.

+0

Каковы атрибуты? – SLaks 2010-12-09 16:24:07

+0

Проблема заключается в атрибутах для * Report * – 2010-12-09 16:25:58

+0

Каковы атрибуты в XML? – SLaks 2010-12-09 16:28:59

ответ

1

Вызов custs.Root.Elements("Detail") будет возвращать все <Detail> элементов, которые прямые детей корневого элемента (<Report>).

Необходимо позвонить по телефону Descendants.

В качестве альтернативы, вы можете позвонить

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

EDIT: Ваши элементы, вероятно, в пространстве имен (xmlns="..." в корне).
Вы должны спросить XLINQ для элементов в правильном пространстве имен:

XNamespace ns = "Info_x0020_Tickets_x0020_Entered"; 
var els = root.Descendants(ns + "Detail"); 
0
var xml= XDocument.Load(FileDetails.FullName); 
var detailList = xml.Root.Decendants("Detail"); 

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

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); 
     } 
Смежные вопросы