Czy istnieje prosta metoda analizowania plików XML w języku C #? Jeśli tak to co?
Czy istnieje prosta metoda analizowania plików XML w języku C #? Jeśli tak to co?
Odpowiedzi:
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= new XmlDocument(); // Create an XML document object
xmlDoc.Load("yourXMLFile.xml"); // Load the XML document from the specified file
// Get elements
XmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress");
XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge");
XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone");
// Display the results
Console.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.
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 swojego XmlSerializer
wystąpienia, jeśli zamierzasz parsować / zapisywać wiele plików XML.
Jeśli przetwarzasz dużą ilość danych (wiele megabajtów), to chcesz używać XmlReader
do strumieniowego analizowania XML.
Cokolwiek innego ( XPathNavigator
, XElement
, XmlDocument
a nawet XmlSerializer
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.
Użyj XmlTextReader
, XmlReader
, XmlNodeReader
i System.Xml.XPath
nazw. Oraz ( XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
).
Zwykle XPath
sprawia, że czytanie XML jest łatwiejsze.
new XmlTextReader()
ani new XmlTextWriter()
. Są przestarzałe od .NET 2.0. Użyj XmlReader.Create()
lub XmlWriter.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!
public void ParseXML(string filePath)
{
// create document instance using XML file path
XDocument 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 tag
IEnumerable<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 doc
XElement element = (from c in doc.Descendants(ns + "exampleTagName" select c).First();
// obtain an element from within an element, same as from doc
XElement embeddedElement = (from c in element.Descendants(ns + "exampleEmbeddedTagName" select c).First();
// obtain an attribute from an element
XAttribute 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 XmlReader
i jego podklasy XmlTextReader
oraz XmlValidatingReader
. Zapewniają szybki, lekki (użycie pamięci itp.), Tylko do przodu sposób parsowania pliku XML.
Jeśli potrzebujesz XPath
moż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 = new XmlDocument();
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
, XPathNavigator
a nawet wyrażeń regularnych. Jeśli opracujesz swoje potrzeby, mogę spróbować podać kilka sugestii.
Możesz parsować XML za pomocą tej biblioteki System.Xml.Linq
. Poniżej znajduje się przykładowy kod użyty do parsowania pliku XML
public CatSubCatList GenerateCategoryListFromProductFeedXML()
{
string path = System.Web.HttpContext.Current.Server.MapPath(_xmlFilePath);
XDocument xDoc = XDocument.Load(path);
XElement xElement = XElement.Parse(xDoc.ToString());
List<Category> lstCategory = xElement.Elements("Product").Select(d => new Category
{
Code = Convert.ToString(d.Element("CategoryCode").Value),
CategoryPath = d.Element("CategoryPath").Value,
Name = GetCateOrSubCategory(d.Element("CategoryPath").Value, 0), // Category
SubCategoryName = GetCateOrSubCategory(d.Element("CategoryPath").Value, 1) // Sub Category
}).GroupBy(x => new { x.Code, x.SubCategoryName }).Select(x => x.First()).ToList();
CatSubCatList catSubCatList = GetFinalCategoryListFromXML(lstCategory);
return catSubCatList;
}
Możesz użyć ExtendedXmlSerializer do serializacji i deserializacji.
Instalacja Możesz zainstalować ExtendedXmlSerializer z nuget lub uruchomić następującą komendę:
Install-Package ExtendedXmlSerializer
Serializacja:
ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj);
Deserializacja
var obj2 = serializer.Deserialize<Message>(xml);
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.
Możesz używać XmlDocument, a do manipulowania danymi lub ich pobierania z atrybutów możesz użyć Linq do klas XML.