Esiste un metodo semplice per analizzare i file XML in C #? E allora?
Esiste un metodo semplice per analizzare i file XML in C #? E allora?
Risposte:
Userei LINQ to XML se siete in .NET 3.5 o superiore.
È 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.
InnerText
qui ottiene il valore di quel nodo, concatenato con tutti i valori dei nodi figlio - giusto? Sembra una cosa strana volere.
InnerText
restituirà 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.
Usa un buon schema XSD per creare un insieme di classi con xsd.exe e usa un XmlSerializer
per 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 XmlSerializer
all'istanza se si intende analizzare / scrivere più file XML.
Se stai elaborando una grande quantità di dati (molti megabyte), vuoi utilizzare XmlReader
lo stream per analizzare l'XML.
Tutto il resto ( XPathNavigator
, XElement
, XmlDocument
e anche XmlSerializer
se 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.
Usare XmlTextReader
, XmlReader
, XmlNodeReader
e il System.Xml.XPath
namespace. E ( XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
).
Di solito XPath
semplifica la lettura di XML, che è quello che potresti cercare.
new XmlTextReader()
o new XmlTextWriter()
. Sono stati deprecati da .NET 2.0. Usa XmlReader.Create()
o XmlWriter.Create()
invece.
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!
Se si utilizza .NET 2.0, provare XmlReader
e le sue sottoclassi XmlTextReader
e XmlValidatingReader
. Forniscono un modo rapido, leggero (utilizzo della memoria, ecc.) E di sola lettura per analizzare un file XML.
Se hai bisogno di XPath
funzionalità, prova XPathNavigator
. Se è necessario l'intero documento in memoria, provare XmlDocument
.
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);
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
, XPathNavigator
o anche le espressioni regolari. Se elaborate le vostre esigenze, posso provare a dare alcuni suggerimenti.
È 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;
}
È 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.
ExtendedXmlSerializer può fare questo e molto altro.
ExtendedXmlSerializer supporta .NET 4.5 o versioni successive e .NET Core . Puoi integrarlo con WebApi e AspCore.
È possibile utilizzare XmlDocument e per manipolare o recuperare i dati dagli attributi è possibile Linq alle classi XML.