2012-01-17 11 views
7

Mam XML wyrażenie:Jak można odczytać konkretne elementy z ciągu XML przy użyciu XMLReader w C#

<GroupBy Collapse=\"TRUE\" GroupLimit=\"30\"> 
     <FieldRef Name=\"Department\" /> 
    </GroupBy> 
    <OrderBy> 
     <FieldRef Name=\"Width\" /> 
    </OrderBy> 

Jestem nowy w języku C#. Próbowałem odczytać atrybut Name elementu FieldRef dla obu elementów, ale nie mogłem. Użyłem XMLElement, czy istnieje sposób na wybranie tych dwóch wartości?

+1

Jaki kod próbowałeś? –

+4

Jaka jest reszta kodu XML? Poprawny plik XML musi mieć jeden węzeł główny. – wsanville

Odpowiedz

9

Mimo delegowania nieprawidłowym formacie XML (bez korzenia), łatwy sposób iterację <FieldRef> elementów jest użycie metody XmlReader.ReadToFollowing:

//Keep reading until there are no more FieldRef elements 
while (reader.ReadToFollowing("FieldRef")) 
{ 
    //Extract the value of the Name attribute 
    string value = reader.GetAttribute("Name"); 
} 

oczywiście bardziej elastyczny i płynny interfejs jest dostarczone przez LINQ do XML, być może byłoby łatwiej użyć tego, jeśli jest dostępne w ramach .NET, na który kierujesz? Następnie kod staje:

using System.Xml.Linq; 

//Reference to your document 
XDocument doc = {document}; 

/*The collection will contain the attribute values (will only work if the elements 
are descendants and are not direct children of the root element*/ 
IEnumerable<string> names = doc.Root.Descendants("FieldRef").Select(e => e.Attribute("Name").Value); 
+0

Problem polega na tym, że ten ciąg nie jest poprawiony, czasami nie zawiera elementu GroupBy, czasami będzie zawierał element OrderBy. Muszę wybrać FieldRef i powinienem wiedzieć, do którego elementu root należy. – Waleed

+0

Zauważyłem, że element FieldRef nie zawsze jest zawarty w tym samym węźle nadrzędnym, potomkowie będą go uwzględniać i wyodrębniać niezależnie od elementu, w którym jest zagnieżdżony. Jeśli chcesz uzyskać element nadrzędny, używając LINQ do XML, spróbuj tego: 'IEnumerable > pairings = doc.Root.Descendants (" FieldRef ") Wybierz (e => new KeyValuePair (e.Parent, e.Attribute ("Name"). Value)); ' –

+0

Mam ciąg nie plik, w jaki sposób zdefiniować doc varaible? jak widzę jego typ XDocument jak mogę połączyć mój ciąg do dokumentu? – Waleed

-1

spróbuj tego:

string xml = "<GroupBy Collapse=\"TRUE\" GroupLimit=\"30\"><FieldRef Name=\"Department\" /></GroupBy><OrderBy> <FieldRef Name=\"Width\" /></OrderBy>"; 
    xml = "<root>" + xml + "</root>"; 
    XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(xml); 
    foreach (XmlNode node in doc.GetElementsByTagName("FieldRef")) 
     Console.WriteLine(node.Attributes["Name"].Value); 
+0

Problem polega na tym, że ten ciąg nie jest poprawiony, czasami nie zawiera elementu GroupBy, czasami będzie zawierał element OrderBy. Muszę wybrać FieldRef i powinienem wiedzieć, do którego elementu root należy. – Waleed

Powiązane problemy