Jak analizować pliki XML? [zamknięte]

Czy istnieje prosta metoda parsowania plików XML w C#? Jeśli tak, to co?

 492
Author: John Saunders, 2008-09-11

12 answers

Użyłbym LINQ do XML jeśli jesteś w.NET 3.5 lub wyższej.

 228
Author: Jon Galloway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-23 15:45:33

To 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);

Istnieje również kilka innych metod do pracy. Na przykład tutaj . I myślę, że nie ma jednej najlepszej metody, aby to zrobić; zawsze musisz wybrać to sam, co jest najbardziej odpowiednie dla Ciebie.

 288
Author: Lukas Šalkauskas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-15 04:15:20

Użyj dobrego schematu XSD , aby utworzyć zestaw klas z xsd.exe i używać XmlSerializer aby utworzyć drzewo obiektów z XML i odwrotnie. Jeśli masz kilka ograniczeń dotyczących modelu, możesz nawet spróbować utworzyć bezpośrednie mapowanie między klasami modelu a XML z atrybutami XML*.

Istnieje artykuł wprowadzający o serializacji XML na MSDN.

Wskazówka dotycząca wydajności: Budowa XmlSerializer jest kosztowna. Zachowaj odniesienie do twoja instancja XmlSerializer, jeśli zamierzasz parsować / zapisywać wiele plików XML.

 44
Author: David Schmitt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-16 01:22:55

Jeśli przetwarzasz dużą ilość danych (wiele megabajtów), chcesz używać XmlReader do strumieniowego analizowania XML.

Anything else (XPathNavigator, XElement, XmlDocument i nawet XmlSerializer Jeśli zachowasz pełny 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.

 22
Author: Simon Steele,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:49

Użycie XmlTextReader, XmlReader, XmlNodeReader oraz System.Xml.XPath przestrzeń nazw. Oraz (XPathNavigator, XPathDocument, XPathExpression, XPathnodeIterator).

Zwykle XPath ułatwia czytanie XML, czyli to, czego możesz szukać.

 15
Author: Vinko Vrsalovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-16 01:21:32

Jeśli używasz. NET 2.0, spróbuj XmlReader i jego podklas XmlTextReader i XmlValidatingReader. Zapewniają szybki, lekki (zużycie pamięci itp.), forward-jedyny sposób na analizę pliku XML.

Jeśli potrzebujesz XPath możliwości, spróbuj XPathNavigator. Jeśli potrzebujesz całego dokumentu w pamięci, spróbuj XmlDocument.

 6
Author: Ash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-16 01:22:24

Nie jestem pewien, czy istnieje "najlepsza praktyka parsowania XML". Istnieje wiele technologii dostosowanych do różnych sytuacji. Sposób użycia zależy od konkretnego scenariusza.

Możesz przejść z LINQ do XML, XmlReader, XPathNavigator lub nawet wyrażenia regularne. Jeśli sprecyzujesz swoje potrzeby, mogę spróbować dać kilka sugestii.

 5
Author: aku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-16 01:21:51

Niedawno zostałem zmuszony do pracy nad aplikacją, która wymagała parsowania dokumentu XML i zgadzam się z Jonem Gallowayem, że podejście oparte na LINQ do XML jest moim zdaniem najlepsze. Musiałem jednak trochę pokopać, aby znaleźć użyteczne przykłady, więc bez zbędnych ceregieli, oto kilka!

Wszelkie komentarze mile widziane, ponieważ ten kod działa, ale może nie być doskonały i chciałbym dowiedzieć się więcej o parsingu 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");
}

Z tymi funkcjami byłem możliwość parsowania dowolnego elementu i dowolnego atrybutu z pliku XML bez problemu!

 5
Author: PJRobot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-23 11:09:28

Możesz przeanalizować XML używając tej biblioteki System.Xml.Linq. Poniżej znajduje się przykładowy kod, którego użyłem do analizy 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;
}
 2
Author: Tapan kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-19 19:05:59

Dodatkowo możesz użyć selektora XPath w następujący sposób (łatwy sposób na wybranie konkretnych 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);

Dokumentacja

 2
Author: Joel Harkes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-17 12:19:38

Możesz użyć ExtendedXmlSerializer do serializacji i deserializacji.

Instalacja Możesz zainstalować ExtendedXmlSerializer z nuget lub uruchomić następujące polecenie:

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 Serializer XML w. NET jest bardzo ograniczony.

  • nie obsługuje serializacji klasy z odniesieniem kołowym lub klasy z interfejsem własność,
  • nie obsługuje słowników,
  • nie ma mechanizmu do odczytu starej wersji XML,
  • jeśli chcesz utworzyć niestandardowy serializer, twoja klasa musi dziedziczyć z IXmlSerializable. Oznacza to, że twoja klasa nie będzie klasą POCO,
  • nie obsługuje MKOl.

ExtendedXmlSerializer może to zrobić i wiele więcej.

ExtendedXmlSerializer support . NET 4.5lub wyższy i . Net Core. Można zintegrować to z WebApi i AspCore.

 0
Author: Wojtpl2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 14:26:33

Możesz użyć XmlDocument i do manipulowania lub pobierania danych z atrybutów możesz Linq do klas XML.

 0
Author: shaishav shukla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-16 12:27:26