2012-04-14 6 views
5

Soy un programador principiante que comienza con C# y servicios web.Uso de XmlTextReader

En el archivo Service.cs de mi servicio web, crear un método ReadXMLFile() donde yo estoy tratando de leer un archivo XML existente, tomar los datos de ella y colocarla a las propiedades correspondientes (DataMembers) que he creado en el IService.cs archivo.

Mi problema es que mi código básicamente no está haciendo nada. Intenté buscar sitios web y tutoriales sobre esto, pero realmente no hay mucho por ahí, especialmente para un principiante como yo. Alguien tiene alguna idea de cómo debería hacerlo, porque lo que he intentado hasta ahora es obviamente incorrecto.

Debajo está mi método ReadXMLFile().

void ReadXMLFile() 
{ 
    XmlTextReader reader = new XmlTextReader("ClassRoll.xml"); 
    reader.Read(); 
    while (reader.Read()) 
    { 
     if (reader.Name == "id") 
     { 
      id = reader.ReadString(); 
     } 
     else if (reader.Name == "firstname") 
     { 
      link = reader.ReadString(); 
     } 
     else if (reader.Name == "lastname") 
     { 
      description = reader.ReadString(); 
     } 
     else if (reader.Name == "count") 
     { 
      description = reader.ReadString(); 
     } 
     else if (reader.Name == "testscore") 
     { 
      description = reader.ReadString(); 
     } 
    } 
} 

este es un ejemplo de mi archivo XML

<classroll> 
    <student> 
    <id>101010</id> 
    <lastname>Smith</lastname> 
    <firstname>Joe</firstname> 
    <testscores count="5"> 
     <score>65</score> 
     <score>77</score> 
     <score>67</score> 
     <score>64</score> 
     <score>80</score> 
    </testscores> 
    </student> 
</classroll> 
+0

Usted puede encontrar [Mejores prácticas para analizar archivos XML] (http://stackoverflow.com/q/55828/1048330) útil – tenorsax

+0

Usted debe compartir su archivo XML o una muestra de ella si es demasiado grande, entonces podemos ver su estructura. –

+1

No debe usar XmlTextReader directamente. Use 'XmlReader.Create()' en su lugar. –

Respuesta

3

probablemente Te estás perdiendo IsStartElement condición() en su bucle while:

while (reader.Read()) 
{ 
    if (reader.IsStartElement()) 
    { 
     if (reader.Name == "id") 
     { 
      id = reader.ReadString(); 
     } 
... 
} 

Además, sería más fácil use XPath o LINQ to XML para leer su XML, por supuesto depende del archivo. Aquí hay algunos ejemplos: XPath y LINQ.

EDITAR: después de ver los detalles del archivo XML

Usted debe actualizar su lógica para realizar un seguimiento de la corriente student y su testscores. Además, tenga en cuenta que count es un atributo. Puede ser complicado muy pronto, le sugiero que eche un vistazo a las muestras mencionadas anteriormente.

+3

Acepto que debe usar LINQ to XML (clase XElement) a menos que tenga una buena razón para no hacerlo; la única buena razón por la que tengo conocimiento es que su documento es demasiado grande para guardarlo todo en la memoria a la vez. – Mason

1

creo, que se obtiene mejor resultado usando XmlDocument

public void ReadXML() 
{ 
    XmlDocument xmlDoc = new XmlDocument(); 
    xmlDoc.Load("<name file>.xml"); 
    xmlEntities = new List<XmlEntity>(); 

    foreach(XmlNode item in xmlDoc.ChildNodes) 
    { 
     GetChildren(item); 
    } 
} 

private void GetChildren(XmlNode node) 
{ 
    if (node.LocalName == "Строка") 
    { 
     //<you get the element here and work with it> 
    } 
    else 
    { 
     foreach (XmlNode item in node.ChildNodes) 
     { 
      GetChildren(item); 
     } 
    } 
} 
0

La razón no su trabajo porque, ejemplo: cuando reader.Name == "nombre" es cierto, pero no es cierto con su valor elementos. Lo que significa exactamente es que el objeto lector lee el siguiente Nodetype, que es XmlNodeType.Element. Entonces, en este caso, mirando su archivo XML, usando reader.Read(); función lee nuevamente el siguiente nodo, que es XmlNodeType.Text, y su valor es entonces Joe. Te estoy dando un ejemplo de la versión de trabajo.

void ReadXMLFile() 
{ 
XmlTextReader reader = new XmlTextReader("ClassRoll.xml"); 
reader.Read(); 
while (reader.Read()) 
{ 
    if (reader.Name == "id") 
    { 
     reader.Read(); 
     if(reader.NodeType == XmlNodeType.Text) 
     { 
      id = reader.Value; 
      reader.Read(); 
     } 

    } 
} 

}