Como é que um ficheiro XML é processado? [fechado]

Existe um método simples de processar ficheiros XML em C#? Em caso afirmativo, o quê?

 492
Author: John Saunders, 2008-09-11

12 answers

Eu usaria o LINQ para XML Se você estiver no. net 3, 5 ou mais.

 228
Author: Jon Galloway, 2018-02-23 15:45:33
É muito simples. Eu sei que estes 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);

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ê.

 288
Author: Lukas Šalkauskas, 2013-06-15 04:15:20

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.

 44
Author: David Schmitt, 2013-06-16 01:22:55

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.

 22
Author: Simon Steele, 2017-05-23 12:02:49

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.

 15
Author: Vinko Vrsalovic, 2013-06-16 01:21:32

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.

 6
Author: Ash, 2013-06-16 01:22:24

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.

 5
Author: aku, 2013-06-16 01:21:51

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!

 5
Author: PJRobot, 2018-03-23 11:09:28

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;
}
 2
Author: Tapan kumar, 2017-07-19 19:05:59

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

A documentação

 2
Author: Joel Harkes, 2017-10-17 12:19:38

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.

 0
Author: Wojtpl2, 2017-02-16 14:26:33

Pode usar o XmlDocument e para manipular ou obter dados de atributos pode Linq para classes XML.

 0
Author: shaishav shukla, 2017-11-16 12:27:26