Eu vi um artigo na Internet e tentei sozinho, o XMLTextReader é mais rápido!
A classe XMLTextReader incluída no namespace System.XML do .NET Framework pode ler dados rapidamente de arquivos XML sem exigir muito dos recursos do sistema. Use a classe XMLTextReader para ler dados de arquivos XML e convertê-los em formato HTML para saída no navegador.
Antes de ler este artigo, os leitores precisam ter alguns conhecimentos básicos: XML, HTML, linguagem de programação C# e alguns conhecimentos de .NET, especialmente do framework ASP.NET.
A estrutura .NET da Microsoft oferece aos desenvolvedores muitas conveniências de desenvolvimento À medida que a importância do XML continua a crescer, os desenvolvedores estão ansiosos pelo desenvolvimento de um conjunto completo de ferramentas XML poderosas. A estrutura .NET atendeu às nossas expectativas e organizou as seguintes classes para XML no namespace System.XML:
XMLTextReader------Fornece acesso rápido, unidirecional e sem buffer a dados XML. (Unidirecional significa que você só pode ler o arquivo XML de frente para trás, não de trás para frente)
XMLValidatingReader------Usado com a classe XMLTextReader, ele fornece a capacidade de verificar esquemas DTD, XDR e XSD.
XMLDocument------segue os padrões primários e secundários da especificação W3C Document Object Model para obter acesso aleatório e em cache aos dados XML. O primeiro nível contém as partes mais básicas do DOM, enquanto o segundo nível adiciona uma variedade de melhorias, incluindo a adição de suporte para namespaces e gráficos em cascata (CSS).
XMLTextWriter------Gere arquivos XML que estejam em conformidade com a especificação W3C XML 1.0.
Este artigo fala principalmente sobre a primeira classe XMLTextReader. O objetivo desta classe é ler dados rapidamente de arquivos XML sem exigir muito dos recursos do sistema (incluindo principalmente memória e tempo do processador). Sob o controle do programa pai, ele implementa esse processo de trabalho operando gradualmente o arquivo XML processando apenas um nó por vez. Em cada nó do arquivo XML, o programa pai pode determinar o tipo do nó, seus atributos e dados (se houver) e outras informações sobre o nó. Com base nessas informações, o programa pai pode escolher se deseja processar esse nó ou ignorar as informações do nó para atender às necessidades de diversas solicitações do aplicativo. Isso é chamado de modelo de processamento pull porque o programa pai faz a solicitação e extrai os nós individuais do arquivo XML e então os processa ou não, conforme necessário.
Podemos comparar a classe XMLTextReader com a XML Simple Application Programming Interface, ou SAX, que é outra tecnologia de leitura de dados XML muito popular entre os programadores. XMLTextReader e SAX são muito semelhantes porque podem ler dados rapidamente de arquivos XML sem consumir muitos recursos do sistema. No entanto, ao contrário do modelo de extração do XMLTextReader, o SAX usa um modelo push: o processador XML usa "eventos" para informar ao aplicativo host quais dados do nó estão disponíveis e quais não podem ser obtidos conforme necessário, o programa host responde adequadamente ou os ignora; . Em outras palavras, os dados são enviados do manipulador SAX para o host. Os programadores debaterão se os modelos de processamento pull-out ou push-in têm mais vantagens, mas não há como negar que ambos os modelos funcionam bem. O .NET Framework não oferece suporte a SAX, mas você pode usar ferramentas SAX existentes, como o analisador MSXML, com seus aplicativos .NET.
A classe XMLTextReader possui construtores para acomodar uma variedade de situações, como a leitura de dados de um fluxo de dados existente ou do Uniform Resource Locator. Mais comumente, você pode querer ler dados XML de um arquivo e existe um construtor correspondente para servir isso. Aqui está um exemplo (todos os meus exemplos de código estão em C#, eles são fáceis de converter se você preferir usar o VISUAL BASIC).
XMLTextReader meuLeitor;
myReader = New XMLTextReader("c:datasales.XML")
cria um loop chamado método Read() O valor de retorno deste método é sempre verdadeiro até atingir o final do arquivo, quando o valor de retorno se torna falso. . Em outras palavras, o loop começa no início do arquivo e lê todos os nós, um de cada vez, até chegar ao final do arquivo:
While (myReader.Read()) {
...
// Processe cada nó aqui.
...
}
Após cada chamada bem-sucedida para Read(), o programa de instanciação XMLTextReader contém informações sobre o nó atual (ou seja, o nó que acabou de ser lido no arquivo). Podemos obter as informações acima dos membros do XMLTextReader, conforme descrito na Tabela 1 e determinar o tipo do nó atual por meio do atributo NodeType; Com base no tipo de nó, o código do programa pode ler os dados do nó, verificar se ele possui atributos e se deve ignorá-los ou realizar operações e processamento correspondentes de acordo com as necessidades do programa.
Ao usar o atributo NodeType, é importante entender como os nós estão relacionados às células XML. Por exemplo, observe o seguinte elemento XML:
<city>Chongqing</city>
XMLtextReader considera este elemento como 3 nós, na seguinte ordem:
1. A tag <city> é lida como um nó do tipo XMLNodeType.Element, e o nome do elemento "city" pode ser obtido no atributo Name do XMLTextReader.
2. Os dados de texto "Chongqing" são lidos como um nó do tipo XMLNodeType.Text. Os dados "Chongqing" podem ser obtidos no atributo Value do XMLTextReader.
3. A tag </city> é lida como um nó do tipo XMLNodeType.EndElement. Da mesma forma, o nome do elemento “cidade” está disponível na propriedade Name do XMLTextReader.
Esses são três tipos de nós importantes. Outros tipos são descritos em detalhes na documentação do .NET.
Se XMLTextReader encontrar um erro, como uma violação da sintaxe XML, ele lançará uma exceção do tipo System.XML.XMLException. O código que usa esta classe deve sempre ser protegido (em um bloco Try...Catch), como você verá mais adiante no programa de demonstração.
Este artigo é apenas uma introdução bastante simples à classe XMLTextReader. A classe XMLTextReader possui alguns membros e é impossível mencioná-los todos aqui. XMLTextReader oferece flexibilidade considerável ao ler dados XML. Mesmo assim, ainda discuti muito para garantir que os leitores possam escrever programas para realizar tarefas que muitas vezes são necessárias no mundo real, que é ler dados de um arquivo XML e depois exibi-los em formato HTML para implementá-los no navegador. mostrar.
Este programa ASP.NET (script) é executado no servidor e gera uma página HTML de volta para o navegador. O script é fornecido no Snippet 1, e o arquivo de dados XML com o qual ele trabalha é fornecido no Snippet 2. Você pode ver que este arquivo XML contém uma lista de relacionamentos; o objetivo do programa é exibir esta lista, que foi formatada para facilitar nossa visualização.
Execute o programa:
1. Salve o trecho de código 1 como um arquivo XMLTextReader.ASPx e o trecho de código 2 como um arquivo XMLData.XML.
2. Coloque os dois arquivos em uma pasta virtual em um servidor web que tenha o .NET Framework instalado.
3. Abra o Internet Explorer e navegue até o arquivo ASPx, por exemplo, em um servidor LAN, a URL seria http://localhost/xmltextreader.ASPx ;.
A maior parte do trabalho do programa é feita pela classe XMLDisplay, especificamente pelo método ProcessXML(). Ele lê os dados XML de um nó por vez. Para o elemento de interesse, os dados do nó e o nome do nó seguidos por dois pontos serão gravados no resultado de saída junto com a tag de formatação HTML correspondente. Nesta fase, o “resultado de saída” consiste em um objeto StringBuilder no qual o texto HTML é armazenado temporariamente.
O método ProcessXML() é chamado a partir do método LoadDocument(). A tarefa executada por este método é gerar um programa de instanciação XMLTextReader e carregar o arquivo XML antes de chamar ProcessXML. Ele também lida com exceções e posteriormente gera mensagens de erro e as exibe no navegador. Em última análise, o método retorna uma string contendo o conteúdo HTML gerado ou uma mensagem de erro se ocorrer uma exceção.
A execução do programa começa com o programa Page_Load(). Quando o navegador solicitar para navegar nesta página, esta etapa será executada automaticamente. O código aqui instancia a classe XMLDisplay e chama seu método LoadDocument(). Se tudo correr normalmente, o valor de retorno do HTML formatado será copiado para uma tag <div> na página e o documento HTML gerado será enviado de volta ao navegador e exibido.
Qual é o desempenho de outras classes do .NET Framework, como a classe XMLDocument, na leitura de dados XML? A classe XMLDocument difere da classe XMLTextReader porque cria uma árvore de nós de todo o documento XML na memória. Desta forma, os dados XML podem ser obtidos aleatoriamente (exatamente o oposto da forma linear como a classe XMLTextReader obtém os dados), e possui perfeita flexibilidade na modificação dos dados e da estrutura do arquivo XML. Além disso, XMLDocument permite realizar transformações XSLT, mas esses recursos adicionais prejudicam a velocidade de execução mais lenta e maior uso dos recursos do sistema.
Trecho de código 1: XmlTextReader.aspx
<%@ Import Namespace="System.Xml" %>
<script language="C#" runat=server>
classe pública XmlDisplay
file://Esta classe lê e processa arquivos XML.
{
string pública LoadDocument(String XmlFileName) {
XmlTextReader xmlReader = null;
StringBuilder html = new StringBuilder();
tentar {
file:// cria uma instância de XMLTextReader.
xmlReader = novo XmlTextReader(XmlFileName);
// Processa arquivos XML
html.Append(ProcessXml(xmlReader));
}
pegar (XmlException ex){
html.Append("Ocorreu uma exceção XML: " +
ex.ToString());
}
catch (Exceção ex){
html.Append("Ocorreu uma exceção comum: " +
ex.ToString());
}
finalmente
{
if (xmlReader! = nulo)
xmlReader.Close();
}
retornar html.ToString();
}
string privada ProcessXml(XmlTextReader xmlReader)
{
StringBuilder temp = new StringBuilder()
file://Este método lê o arquivo XML e gera o documento HTML de saída.
enquanto (xmlReader.Read())
{
// Manipula o início de um nó de elemento.
if (xmlReader.NodeType == XmlNodeType.Element)
{
file://ignora os elementos <people> e <person>
if ((xmlReader.Name != "pessoa") && (xmlReader.Name != "pessoas"))
{
file://Se for um elemento <category>, inicia um novo parágrafo
if (xmlReader.Name == "categoria" )
temp.Append("<p>");
file://adiciona nomes de elementos à saída
temp.Append(xmlReader.Name + ": ");
}
}
// Processa nós de texto
caso contrário, se (xmlReader.NodeType == XmlNodeType.Text)
temp.Append(xmlReader.Value + "<br>");
file:// lida com o final do nó do elemento
caso contrário, se (xmlReader.NodeType == XmlNodeType.EndElement)
{
Se file:// for um nó <email>, adicione uma tag para finalizar o parágrafo.
if (xmlReader.Name == "e-mail")
temp.Append("</p>");
}
}//Termina o loop while
return temp.ToString();
} file://End Método ProcessXML
} file://End XmlDisplay class
private void Page_Load(Object sender, EventArgs e){
file://Cria uma instância da classe XmlDisplay
XmlDisplay XmlDisplayDemo = new XmlDisplay();
saída.InnerHtml = XmlDisplayDemo.LoadDocument(Server.MapPath("XMLData.xml"));
}
</roteiro>
<html>
<cabeça>
</cabeça>
<corpo>
<h2>Classe de demonstração XmlTextReader</h2>
<div id="saída" runat="servidor"/>
</corpo>
</html>
1 vazio estático principal (string[] args)
2 {
3 DataHora d1 =DataHora.Agora;
4XmlDocumentTest();
5 DataHora d2 =DataHora.Agora;
6 Intervalo de tempo ts =d2-d1;
7
8 Console.WriteLine(ts.TotalMilliseconds);
9Console.Read();
10
11}
12
13
14 string estática pública XmlFileName = "../../XML/1.xml";
15
16 vazio estático privado XmlTextReaderTest()
17 {
18 Leitor XmlTextReader = new XmlTextReader(XmlFileName);
19 enquanto (leitor.Read())
20 {
21 bool saída =falso;
22 opção (leitor.NodeType)
vinte e três {
24 casos XmlNodeType.Element:
25 pausas;
26 caso XmlNodeType.Text:
27 if (leitor.Value=="último")
28 {
29 saída=verdadeiro;
30}
31 pausa;
32 casos XmlNodeType.EndElement:
33 pausa;
34 padrão:
35 pausa;
36}
37 se(sair)
38 {
39 retorno;
40
41}
42
43}
44}
45
46 vazio estático privado XmlDocumentTest()
47 {
48 XmlDocument xd =new XmlDocument();
49 xd.Load(NomeArquivoXml);
50 nó XmlNode = xd.SelectSingleNode("/pessoas/pessoa[categoria='último']");
51 Console.Write(nó.Nome);
52}
Acontece que o primeiro demora muito:
Acontece que o segundo é demorado:
http://www.cnblogs.com/goody9807/archive/2006/10/24/534888.html