Como é que um ficheiro XML é processado? [fechado]
Existe um método simples de processar ficheiros XML em C#? Em caso afirmativo, o quê?
12 answers
Eu usaria o LINQ para XML Se você estiver no. net 3, 5 ou mais.
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);
Também existem algunsoutros métodos com os quais trabalhar. Por exemplo, aqui. E eu acho que não há um melhor método para fazer isso; você sempre precisa escolhê-lo por si mesmo, o que é mais adequado para você.
Use um bom XSD Schema para criar um conjunto de classes com xsd.exe e utilizar um XmlSerializer
para criar uma árvore de objetos a partir de seu XML e vice-versa. Se tiver poucas restrições no seu Modelo, poderá até tentar criar um mapeamento directo entre as classes do modelo e o XML com os atributos Xml*.
Existe um artigo introdutório sobre a serialização XML no MSDN.
Dica de desempenho: construir um XmlSerializer
é caro. Manter a referência à sua instância XmlSerializer
se pretende processar/escrever vários ficheiros XML.
Se está a processar uma grande quantidade de dados (muitos megabytes), então quer usar XmlReader
para transmitir o XML.
Qualquer outra coisa (XPathNavigator
, XElement
, XmlDocument
e mesmo XmlSerializer
se mantiver o gráfico completo de objectos gerados) irá resultar em uma elevada utilização de memória e também um tempo de carga muito lento.
Claro, se você precisar de todos os dados na memória de qualquer maneira, então você pode não ter muita escolha.
Usar XmlTextReader
, XmlReader
, XmlNodeReader
e o System.Xml.XPath
espaço de nomes. E (XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
).
Normalmente XPath
torna a leitura XML mais fácil, que é o que você pode estar procurando.
Se está a usar o. NET 2. 0, tente XmlReader
e as suas subclasses XmlTextReader
, e XmlValidatingReader
. Eles fornecem um rápido, leve (uso de memória, etc.), forward-only way to parse an XML file.
Se precisares de Ajuda XPath
capacidades, Experimente o XPathNavigator
. Se você precisar de todo o documento na memória tente XmlDocument
.
Não tenho a certeza se existe" melhor prática para processar XML". Existem inúmeras tecnologias adequadas para diferentes situações. A forma de usar depende do cenário Concreto.
Você pode ir com LINQ para XML, XmlReader
, XPathNavigator
ou até expressões regulares. Se você elaborar suas necessidades, eu posso tentar dar algumas sugestões.
Recentemente, foi-me pedido que trabalhasse numa aplicação que envolvesse o processamento de um documento XML e concordo com Jon Galloway que a abordagem baseada em LINQ para XML é, na minha opinião, a melhor. No entanto, eu tive que cavar um pouco para encontrar exemplos utilizáveis, assim, sem mais ado, aqui estão alguns!
Qualquer comentário bem-vindo como este código funciona, mas pode não ser perfeito e eu gostaria de saber mais sobre processar XML para este projecto!
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 estas funções I foi capaz de processar qualquer elemento e qualquer atributo a partir de um arquivo XML nenhum problema em tudo!
Poderá processar o XML com esta biblioteca System.Xml.Linq
. Abaixo está o código de exemplo que usei para processar um ficheiro 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;
}
Além disso, pode usar o selector XPath da seguinte forma (forma fácil de seleccionar 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);
Você pode usar ExtendedXmlSerializer para serializar e deserializar.
Instalação Pode instalar o ExtendedXmlSerializer a partir de nuget ou executar o seguinte comando:
Install-Package ExtendedXmlSerializer
Serialização:
ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj);
Deserialização
var obj2 = serializer.Deserialize<Message>(xml);
O serializador padrão de XML no. NET é muito limitado.
- não suporta a serialização da classe com referência circular ou classe COM interface propriedade,
- não suporta dicionários,
- Não existe nenhum mecanismo para ler a versão antiga do XML,
- Se quiser criar um serializador personalizado, a sua classe deve herdar do Ixmlserializável. Isto significa que a sua aula não será uma aula POCO,
- não suporta o COI.
Extendedxmlserialiser pode fazer isso e muito mais.
Suporte Extendedxmlserializador . net 4. 5 ou superior e núcleo de rede . Podes. integre-o com WebApi e AspCore.
Pode usar o XmlDocument e para manipular ou obter dados de atributos pode Linq para classes XML.