Ok, otworzyłem to ponownie. Duplikat był rozwiązaniem czytnika XML, w którym chodzi o parsowanie plików XML. Posssible duplikat widać w pytaniach edycji historia ps @GeorgeStocker
Jeremy Thompson
1
@JeremyThompson Jednym z powodów, dla których był to duplikat, jest to, że drugie pytanie ma znacznie lepszą odpowiedź. Najlepsza odpowiedź, będąca prostą odpowiedzią „tylko link”, nie jest przydatna.
George Stocker
1
@GeorgeStocker pytania są wystarczająco różne, aby współistnieć i oba mają świetne odpowiedzi, a te zaakceptowane wykorzystują różne technologie. Właśnie dlatego głosowałem, że zostawiamy to otwarte, wiem, że ten zaakceptowany jest tylko linkiem, ale jest to MSDN i został napisany wcześniej, co było niedopuszczalne, mam nadzieję, że efekt uboczny ponownego otwarcia rozweseli nieco Jona, przeczytaj jego profil . W każdym razie na zdrowie.
Jeremy Thompson
Odpowiedzi:
245
Chciałbym użyć LINQ do XML , jeśli jesteś w .NET 3.5 lub wyższej.
To jest bardzo proste. Wiem, że są to standardowe metody, ale możesz stworzyć własną bibliotekę, aby poradzić sobie z tym znacznie lepiej.
Oto kilka przykładów:
XmlDocument xmlDoc=newXmlDocument();// Create an XML document object
xmlDoc.Load("yourXMLFile.xml");// Load the XML document from the specified file// Get elementsXmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress");XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge");XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone");// Display the resultsConsole.WriteLine("Address: "+ girlAddress[0].InnerText);Console.WriteLine("Age: "+ girlAge[0].InnerText);Console.WriteLine("Phone Number: "+ girlCellPhoneNumber[0].InnerText);
Ponadto istnieje kilka innych metod pracy. Na przykład tutaj . I myślę, że nie ma jednej najlepszej metody, aby to zrobić; zawsze musisz sam to wybrać, co jest dla Ciebie najbardziej odpowiednie.
+1 za wzmiankę o XmlDocument, który w niektórych przypadkach jest znacznie wygodniejszy niż interfejsy serializacji. Jeśli szukasz jednego określonego elementu, możesz uzyskać dostęp do elementów podrzędnych za pomocą indeksu: xmlDoc [„Root”], a te mogą być powiązane: xmlDoc [„Root”] [„Folder”] [„Item”], aby wykopać hierarchia (choć rozsądne jest potwierdzenie, że te elementy faktycznie istnieją)
Jason Williams
1
InnerTexttutaj dostaje się wartość tego węzła, połączoną ze wszystkimi wartościami węzłów potomnych - prawda? Wydaje się, że to dziwna rzecz.
Don Cheadle,
17
Programista z listą koleżanek? Kombinowanie!
E. van Putten,
1
@ E.vanPutten nie w dzisiejszych czasach. To nie jest Revenge of the Nerds
user4052054
@DonCheadle Jeśli nie spodziewasz się, że będą jakieś węzły podrzędne, zwrócę InnerTextpo prostu wartość węzła - właśnie tego (ja i prawdopodobnie wszyscy inni czytający to pytanie) analizuję XML w pierwszej kolejności.
F1Krazy
48
Użyj dobrego schematu XSD, aby utworzyć zestaw klas za pomocą xsd.exe, a następnie użyj, XmlSerializeraby utworzyć drzewo obiektów z pliku XML i odwrotnie. Jeśli masz kilka ograniczeń dotyczących swojego modelu, możesz nawet spróbować utworzyć bezpośrednie mapowanie między klasami modelu a XML za pomocą atrybutów Xml *.
Wskazówka dotycząca wydajności: Budowa XmlSerializerjest kosztowna. Zachowaj odniesienie do swojego XmlSerializerwystąpienia, jeśli zamierzasz parsować / zapisywać wiele plików XML.
Dobrym przykładem jest „Przykład zamówienia zakupu” w środku tego przykładu z Microsoft. msdn.microsoft.com/en-us/library/58a18dwa.aspx . Unikasz tworzenia schematu - twoja klasa c # jest schematem ozdobionym atrybutami C #.
Mark Lakata,
25
Jeśli przetwarzasz dużą ilość danych (wiele megabajtów), to chcesz używać XmlReaderdo strumieniowego analizowania XML.
Cokolwiek innego ( XPathNavigator, XElement, XmlDocumenta nawet XmlSerializerjeśli zachować pełną wygenerowany wykres obiektu) spowoduje wysokie zużycie pamięci , a także bardzo powolny czas ładowania.
Oczywiście, jeśli i tak potrzebujesz wszystkich danych w pamięci, możesz nie mieć dużego wyboru.
Do Twojej wiadomości nie powinieneś używać new XmlTextReader()ani new XmlTextWriter(). Są przestarzałe od .NET 2.0. Użyj XmlReader.Create()lub XmlWriter.Create()zamiast.
John Saunders,
10
Niedawno zostałem zmuszony do pracy nad aplikacją, która wymagała parsowania dokumentu XML i zgadzam się z Jonem Gallowayem, że moim zdaniem podejście oparte na LINQ to XML jest najlepsze. Musiałem jednak trochę kopać, aby znaleźć użyteczne przykłady, więc bez zbędnych ceregieli, oto kilka!
Wszelkie komentarze są mile widziane, ponieważ ten kod działa, ale może nie być idealny. Chciałbym dowiedzieć się więcej na temat analizowania XML dla tego projektu!
publicvoidParseXML(string filePath){// create document instance using XML file pathXDocument doc =XDocument.Load(filePath);// get the namespace to that within of the XML (xmlns="...")XElement root = doc.Root;XNamespace ns = root.GetDefaultNamespace();// obtain a list of elements with specific tagIEnumerable<XElement> elements =from c in doc.Descendants(ns +"exampleTagName")select c;// obtain a single element with specific tag (first instance), useful if only expecting one instance of the tag in the target docXElement element =(from c in doc.Descendants(ns +"exampleTagName"select c).First();// obtain an element from within an element, same as from docXElement embeddedElement =(from c in element.Descendants(ns +"exampleEmbeddedTagName"select c).First();// obtain an attribute from an elementXAttribute attribute = element.Attribute("exampleAttributeName");}
Dzięki tym funkcjom byłem w stanie przeanalizować dowolny element i dowolny atrybut z pliku XML, nie ma problemu!
Jeśli używasz .NET 2.0, spróbuj XmlReaderi jego podklasy XmlTextReaderoraz XmlValidatingReader. Zapewniają szybki, lekki (użycie pamięci itp.), Tylko do przodu sposób parsowania pliku XML.
Jeśli potrzebujesz XPathmożliwości, wypróbuj XPathNavigator. Jeśli potrzebujesz całego dokumentu w pamięci, spróbuj XmlDocument.
Ponadto możesz użyć selektora XPath w następujący sposób (łatwy sposób wyboru określonych węzłów):
XmlDocument doc =newXmlDocument();
doc.Load("test.xml");var found = doc.DocumentElement.SelectNodes("//book[@title='Barry Poter']");// select all Book elements in whole dom, with attribute title with value 'Barry Poter'// Retrieve your data here or change XML here:foreach(XmlNode book in nodeList){
book.InnerText="The story began as it was...";}Console.WriteLine("Display XML:");
doc.Save(Console.Out);
Nie jestem pewien, czy istnieje „najlepsza praktyka do analizowania XML”. Istnieje wiele technologii dostosowanych do różnych sytuacji. Wybór sposobu zależy od konkretnego scenariusza.
Możesz iść z LINQ do XML , XmlReader, XPathNavigatora nawet wyrażeń regularnych. Jeśli opracujesz swoje potrzeby, mogę spróbować podać kilka sugestii.
Odpowiedzi:
Chciałbym użyć LINQ do XML , jeśli jesteś w .NET 3.5 lub wyższej.
źródło
To jest bardzo proste. Wiem, że są to standardowe metody, ale możesz stworzyć własną bibliotekę, aby poradzić sobie z tym znacznie lepiej.
Oto kilka przykładów:
Ponadto istnieje kilka innych metod pracy. Na przykład tutaj . I myślę, że nie ma jednej najlepszej metody, aby to zrobić; zawsze musisz sam to wybrać, co jest dla Ciebie najbardziej odpowiednie.
źródło
InnerText
tutaj dostaje się wartość tego węzła, połączoną ze wszystkimi wartościami węzłów potomnych - prawda? Wydaje się, że to dziwna rzecz.InnerText
po prostu wartość węzła - właśnie tego (ja i prawdopodobnie wszyscy inni czytający to pytanie) analizuję XML w pierwszej kolejności.Użyj dobrego schematu XSD, aby utworzyć zestaw klas za pomocą xsd.exe, a następnie użyj,
XmlSerializer
aby utworzyć drzewo obiektów z pliku XML i odwrotnie. Jeśli masz kilka ograniczeń dotyczących swojego modelu, możesz nawet spróbować utworzyć bezpośrednie mapowanie między klasami modelu a XML za pomocą atrybutów Xml *.Jest artykuł wprowadzający na temat serializacji XML na MSDN.
Wskazówka dotycząca wydajności: Budowa
XmlSerializer
jest kosztowna. Zachowaj odniesienie do swojegoXmlSerializer
wystąpienia, jeśli zamierzasz parsować / zapisywać wiele plików XML.źródło
Jeśli przetwarzasz dużą ilość danych (wiele megabajtów), to chcesz używać
XmlReader
do strumieniowego analizowania XML.Cokolwiek innego (
XPathNavigator
,XElement
,XmlDocument
a nawetXmlSerializer
jeśli zachować pełną wygenerowany wykres obiektu) spowoduje wysokie zużycie pamięci , a także bardzo powolny czas ładowania.Oczywiście, jeśli i tak potrzebujesz wszystkich danych w pamięci, możesz nie mieć dużego wyboru.
źródło
Użyj
XmlTextReader
,XmlReader
,XmlNodeReader
iSystem.Xml.XPath
nazw. Oraz (XPathNavigator
,XPathDocument
,XPathExpression
,XPathnodeIterator
).Zwykle
XPath
sprawia, że czytanie XML jest łatwiejsze.źródło
new XmlTextReader()
aninew XmlTextWriter()
. Są przestarzałe od .NET 2.0. UżyjXmlReader.Create()
lubXmlWriter.Create()
zamiast.Niedawno zostałem zmuszony do pracy nad aplikacją, która wymagała parsowania dokumentu XML i zgadzam się z Jonem Gallowayem, że moim zdaniem podejście oparte na LINQ to XML jest najlepsze. Musiałem jednak trochę kopać, aby znaleźć użyteczne przykłady, więc bez zbędnych ceregieli, oto kilka!
Wszelkie komentarze są mile widziane, ponieważ ten kod działa, ale może nie być idealny. Chciałbym dowiedzieć się więcej na temat analizowania XML dla tego projektu!
Dzięki tym funkcjom byłem w stanie przeanalizować dowolny element i dowolny atrybut z pliku XML, nie ma problemu!
źródło
Jeśli używasz .NET 2.0, spróbuj
XmlReader
i jego podklasyXmlTextReader
orazXmlValidatingReader
. Zapewniają szybki, lekki (użycie pamięci itp.), Tylko do przodu sposób parsowania pliku XML.Jeśli potrzebujesz
XPath
możliwości, wypróbujXPathNavigator
. Jeśli potrzebujesz całego dokumentu w pamięci, spróbujXmlDocument
.źródło
Ponadto możesz użyć selektora XPath w następujący sposób (łatwy sposób wyboru określonych węzłów):
dokumentacja
źródło
Nie jestem pewien, czy istnieje „najlepsza praktyka do analizowania XML”. Istnieje wiele technologii dostosowanych do różnych sytuacji. Wybór sposobu zależy od konkretnego scenariusza.
Możesz iść z LINQ do XML ,
XmlReader
,XPathNavigator
a nawet wyrażeń regularnych. Jeśli opracujesz swoje potrzeby, mogę spróbować podać kilka sugestii.źródło
Możesz parsować XML za pomocą tej biblioteki
System.Xml.Linq
. Poniżej znajduje się przykładowy kod użyty do parsowania pliku XMLźródło
Możesz użyć ExtendedXmlSerializer do serializacji i deserializacji.
Instalacja Możesz zainstalować ExtendedXmlSerializer z nuget lub uruchomić następującą komendę:
Serializacja:
Deserializacja
Standardowy serializator XML w .NET jest bardzo ograniczony.
ExtendedXmlSerializer może to zrobić i wiele więcej.
Obsługa ExtendedXmlSerializer .NET 4.5 lub nowszy i .NET Core . Możesz zintegrować go z WebApi i AspCore.
źródło
Możesz używać XmlDocument, a do manipulowania danymi lub ich pobierania z atrybutów możesz użyć Linq do klas XML.
źródło