2010-03-03 16 views
13

Mam źródłowe pliki XML, które zawierają wiele elementów root i nic nie mogę na to poradzić. Jaki byłby najlepszy sposób załadowania tych fragmentów do XDocument z jednym węzłem głównym, który mogę utworzyć, aby mieć prawidłowy dokument XML?LINQ to XML - Załaduj fragmenty XML z pliku

Próbka:

<product></product> 
<product></product> 
<product></product> 

Powinno być coś takiego:

<products> 
    <product></product> 
    <product></product> 
    <product></product> 
</products> 

Dzięki!

Odpowiedz

18

Oto jak to zrobić z XmlReader, który jest prawdopodobnie najbardziej elastyczne i najszybciej wykonywania podejścia:

XmlReaderSettings xrs = new XmlReaderSettings(); 
xrs.ConformanceLevel = ConformanceLevel.Fragment; 

XDocument doc = new XDocument(new XElement("root")); 
XElement root = doc.Descendants().First(); 

using (StreamReader fs = new StreamReader("XmlFile1.xml")) 
using (XmlReader xr = XmlReader.Create(fs, xrs)) 
{ 
    while(xr.Read()) 
    { 
     if (xr.NodeType == XmlNodeType.Element) 
     { 
      root.Add(XElement.Load(xr.ReadSubtree()));     
     } 
    } 
} 
+0

Dzięki Robert, właśnie to próbowałem zrobić, ale miałem problemy z prawidłowym użyciem czytnika :). To jest również świetne, ponieważ mogę dodać kolejną kontrolę nazwy elementu, aby odfiltrować niektóre elementy, które nie są mi potrzebne. –

+0

@Robert Rossney: dlaczego "if (xr.NodeType == XmlNodeType.Element)" sprawdź? –

+1

Metoda "Read" może zwrócić wiele rzeczy, które nie są elementami - sekcje CDATA, instrukcje przetwarzania, komentarze, deklaracje XML, odwołania do encji, itp. Powyższy kod pominie komentarze (na przykład) zamiast dodawać je do ' XDocument', który może nie być tym, co pożądane, ale przynajmniej nie rzuci wyjątku. –

-5

mniej więcej coś w stylu.

var newXML= new XElement("products", 
       from x in Xdocuments.parse(originalFile).descendants("product")      
       select new XElement("product",x.value) 
      ); 
+0

ten będzie nadal wyjątek podczas wykonywania XDocument.Parse (originalFile) –

+0

rzeczywiście, miałem na myśli obciążenie, zrobiłem powiedzieć „coś takiego”! :) parsujesz ciąg lub ładujesz plik oba są dobre :) –

+0

Load() też nie działa. Czy próbowałeś tego? –

8

Zostawię cię, aby umieścić go w polu strun, ale można po prostu to zrobić:

myDoc=new XmlDocument(); 
myDoc.LoadXml("<products>"+myData+"</products>"); 
+1

Nie lubię ciągnąć za sznurka z pliku i po prostu umieszczać go tam bez jakiejś formy weryfikacji, która jest faktycznie poprawnym XML-em. –

+0

Szybka i brudna to naprawdę dobra sztuczka do zapamiętania –