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.