Come si analizzano i file XML? [chiuso]


492

Esiste un metodo semplice per analizzare i file XML in C #? E allora?


potresti usare questa implementazione: stackoverflow.com/a/34813985/5784646
— Elogio

Ok, ho riaperto questo. Il duplicato era una soluzione XML Reader in cui si trattava di analizzare i file XML. Il possibile duplicato può essere visto nelle domande modifica cronologia ps @GeorgeStocker
— Jeremy Thompson

1
@JeremyThompson Uno dei motivi per cui questo era un duplicato è che l'altra domanda ha una risposta molto migliore. La risposta migliore essendo una semplice risposta "solo link" non è utile.
— George Stocker,

1
@GeorgeStocker le domande sono abbastanza diverse per coesistere ed entrambe hanno grandi risposte, oltre a quelle accettate utilizzano tecnologie diverse. Ecco perché ho votato per lasciarlo aperto, so che questo accettato è solo un link ma è MSDN ed è stato scritto in un momento prima che era inaccettabile, speriamo che un effetto collaterale della riapertura stia rincuorando Jon un po ', leggendo il suo profilo . Comunque saluti.
— Jeremy Thompson,

Risposte:



314

È molto semplice. So che questi sono metodi standard, ma puoi creare la tua libreria per gestirli molto meglio.

Ecco alcuni esempi:

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

Inoltre, ci sono altri metodi con cui lavorare. Per esempio qui . E penso che non esiste un metodo migliore per farlo; devi sempre sceglierlo da solo, ciò che è più adatto a te.


47
+1 per menzionare XmlDocument, che in alcuni casi è molto più conveniente delle interfacce di serializzazione. Se stai cercando un elemento specifico, puoi accedere agli elementi figlio con l'indicizzatore: xmlDoc ["Root"] e questi possono essere concatenati: xmlDoc ["Root"] ["Folder"] ["Item"] per scavare gerarchia (anche se è ragionevole confermare che questi elementi esistono davvero)
— Jason Williams,

1
InnerTextqui ottiene il valore di quel nodo, concatenato con tutti i valori dei nodi figlio - giusto? Sembra una cosa strana volere.
— Don Cheadle,

17
Un programmatore con un elenco di amiche? Attività disonesta!
— E. van Putten,

1
@ E.vanPutten non al giorno d'oggi. Questa non è Revenge of the Nerds
— user4052054

@DonCheadle Se non ti aspetti che ci siano nodi figlio, allora InnerTextrestituirà semplicemente il valore del nodo - che è quello che io (e probabilmente tutti gli altri leggendo questa domanda) sto analizzando l'XML per trovare in primo luogo.
— F1Krazy,

48

Usa un buon schema XSD per creare un insieme di classi con xsd.exe e usa un XmlSerializerper creare un albero di oggetti dal tuo XML e viceversa. Se hai poche restrizioni sul tuo modello, potresti persino provare a creare un mapping diretto tra le tue classi di modello e l'XML con gli attributi Xml *.

C'è un articolo introduttivo sulla serializzazione XML su MSDN.

Suggerimento per le prestazioni: la costruzione di un XmlSerializerè costoso. Conservare un riferimento XmlSerializerall'istanza se si intende analizzare / scrivere più file XML.



5
Un buon esempio è "Esempio di ordine di acquisto" nel mezzo di questo esempio di Microsoft. msdn.microsoft.com/en-us/library/58a18dwa.aspx . Eviti di dover creare uno schema: la tua classe c # è lo schema, ornato con attributi C #.
— Mark Lakata,

25

Se stai elaborando una grande quantità di dati (molti megabyte), vuoi utilizzare XmlReaderlo stream per analizzare l'XML.

Tutto il resto ( XPathNavigator, XElement, XmlDocumente anche XmlSerializerse si mantiene il pieno oggetto grafico generato) si tradurrà in un elevato utilizzo della memoria e anche un tempo di caricamento molto lento.

Naturalmente, se hai comunque bisogno di tutti i dati in memoria, potresti non avere molta scelta.



10

Recentemente mi è stato richiesto di lavorare su un'applicazione che comportava l'analisi di un documento XML e sono d'accordo con Jon Galloway che l'approccio basato su LINQ to XML è, a mio avviso, il migliore. Tuttavia, ho dovuto scavare un po 'per trovare esempi utilizzabili, quindi senza ulteriori indugi, eccone alcuni!

Tutti i commenti sono ben accetti poiché questo codice funziona ma potrebbe non essere perfetto e vorrei saperne di più sull'analisi di XML per questo progetto!

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");
}

Con queste funzioni sono stato in grado di analizzare qualsiasi elemento e qualsiasi attributo da un file XML senza alcun problema!


8

Se si utilizza .NET 2.0, provare XmlReadere le sue sottoclassi XmlTextReadere XmlValidatingReader. Forniscono un modo rapido, leggero (utilizzo della memoria, ecc.) E di sola lettura per analizzare un file XML.

Se hai bisogno di XPathfunzionalità, prova XPathNavigator. Se è necessario l'intero documento in memoria, provare XmlDocument.


7

In Aggiunta è possibile utilizzare il selettore XPath nel modo seguente (modo semplice per selezionare nodi specifici):

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

la documentazione


6

Non sono sicuro dell'esistenza di "best practice per l'analisi di XML". Esistono numerose tecnologie adatte a diverse situazioni. Quale modo di usare dipende dallo scenario concreto.

Si può andare con LINQ to XML , XmlReader, XPathNavigatoro anche le espressioni regolari. Se elaborate le vostre esigenze, posso provare a dare alcuni suggerimenti.


3
regex per xml. sei un mostro.
— sarà il

3

È possibile analizzare l'XML utilizzando questa libreria System.Xml.Linq. Di seguito è riportato il codice di esempio che ho usato per analizzare un file 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;
}

1

È possibile utilizzare ExtendedXmlSerializer per serializzare e deserializzare.

Instalation È possibile installare ExtendedXmlSerializer da NuGet o eseguire il seguente comando:

Install-Package ExtendedXmlSerializer

serializzazione:

ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj);

deserializzazione

var obj2 = serializer.Deserialize<Message>(xml);

Il serializzatore XML standard in .NET è molto limitato.

  • Non supporta la serializzazione di classe con riferimento circolare o classe con proprietà di interfaccia,
  • Non supporta i dizionari,
  • Non esiste alcun meccanismo per leggere la vecchia versione di XML,
  • Se si desidera creare un serializzatore personalizzato, la classe deve ereditare da IXmlSerializable. Ciò significa che la tua classe non sarà una classe POCO,
  • Non supporta IoC.

ExtendedXmlSerializer può fare questo e molto altro.

ExtendedXmlSerializer supporta .NET 4.5 o versioni successive e .NET Core . Puoi integrarlo con WebApi e AspCore.


1

È possibile utilizzare XmlDocument e per manipolare o recuperare i dati dagli attributi è possibile Linq alle classi XML.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.