Existe um método simples de analisar arquivos XML em c #? Se sim, o que?
Existe um método simples de analisar arquivos XML em c #? Se sim, o que?
Respostas:
Eu usaria o LINQ to XML se você estiver no .NET 3.5 ou superior.
É muito simples. Sei que esses são métodos padrão, mas você pode criar sua própria biblioteca para lidar com isso muito melhor.
aqui estão alguns exemplos:
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);
Além disso, existem outros métodos para trabalhar. Por exemplo, aqui . E acho que não há um método melhor para fazer isso; você sempre precisa escolher por si mesmo, o que é mais adequado para você.
InnerText
aqui obtém o valor desse nó, concatenado com todos os valores dos nós filhos - certo? Parece uma coisa estranha de querer.
InnerText
só vai retornar o valor do nó - que é o que eu (e provavelmente todo mundo lendo esta questão) estou analisando o XML para encontrar, em primeiro lugar.
Use um bom esquema XSD para criar um conjunto de classes com xsd.exe e use um XmlSerializer
para criar uma árvore de objetos a partir do seu XML e vice-versa. Se você tiver poucas restrições em seu modelo, você pode até tentar criar um mapeamento direto entre as classes de modelo e o XML com os atributos Xml *.
Há um artigo introdutório sobre serialização de XML no MSDN.
Dica de desempenho: construir um XmlSerializer
é caro. Mantenha uma referência à sua XmlSerializer
instância se você pretende analisar / gravar vários arquivos XML.
Se você estiver processando uma grande quantidade de dados (muitos megabytes), deseja usar o XmlReader
fluxo para analisar o XML.
Qualquer outra coisa ( XPathNavigator
, XElement
, XmlDocument
e até mesmo XmlSerializer
se você manter o gráfico completo objeto gerado) resultará em alto uso da memória e também um tempo de carregamento muito lento.
Obviamente, se você precisar de todos os dados na memória de qualquer maneira, poderá não ter muita escolha.
Use XmlTextReader
, XmlReader
, XmlNodeReader
eo System.Xml.XPath
namespace. E ( XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
).
Geralmente XPath
facilita a leitura de XML, e é isso que você pode estar procurando.
new XmlTextReader()
ou new XmlTextWriter()
. Eles foram preteridos desde o .NET 2.0. Use XmlReader.Create()
ou em XmlWriter.Create()
vez disso.
Recentemente, fui solicitado a trabalhar em um aplicativo que envolvia a análise de um documento XML e concordo com Jon Galloway que a abordagem baseada em LINQ to XML é, na minha opinião, a melhor. No entanto, tive que cavar um pouco para encontrar exemplos úteis, portanto, sem mais delongas, aqui estão alguns!
Quaisquer comentários bem-vindos, pois esse código funciona, mas pode não ser perfeito, e eu gostaria de saber mais sobre a análise de XML para este projeto!
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");
}
Com essas funções, eu era capaz de analisar qualquer elemento e atributo de um arquivo XML sem nenhum problema!
Se você estiver usando o .NET 2.0, tente XmlReader
e suas subclasses XmlTextReader
e XmlValidatingReader
. Eles fornecem uma maneira rápida, leve (uso de memória etc.) e somente encaminhar para analisar um arquivo XML.
Se você precisar de XPath
recursos, tente o XPathNavigator
. Se você precisar de todo o documento na memória, tente XmlDocument
.
Além disso, você pode usar o seletor XPath da seguinte maneira (maneira fácil de selecionar nós específicos):
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);
Não sei se existe a "melhor prática para analisar XML". Existem inúmeras tecnologias adequadas para diferentes situações. A maneira de usar depende do cenário concreto.
Você pode ir com o LINQ to XML , XmlReader
, XPathNavigator
ou até mesmo expressões regulares. Se você elaborar suas necessidades, posso tentar dar algumas sugestões.
Você pode analisar o XML usando esta biblioteca System.Xml.Linq
. Abaixo está o código de exemplo que eu usei para analisar um arquivo 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;
}
Você pode usar o ExtendedXmlSerializer para serializar e desserializar.
Instalação Você pode instalar o ExtendedXmlSerializer a partir do nuget ou executar o seguinte comando:
Install-Package ExtendedXmlSerializer
Serialização:
ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj);
Desserialização
var obj2 = serializer.Deserialize<Message>(xml);
O serializador XML padrão no .NET é muito limitado.
O ExtendedXmlSerializer pode fazer isso e muito mais.
O ExtendedXmlSerializer suporta .NET 4.5 ou superior e .NET Core . Você pode integrá-lo ao WebApi e AspCore.
Você pode usar o XmlDocument e, para manipular ou recuperar dados de atributos, pode usar as classes Linq to XML.