2010-10-30 88 views
49

Me estoy consultando un servicio basado en jabón y desean analizar el XML devuelto sin embargo cuando intento cargar el XML en un xdoc con el fin de consultar los datos. recibo un mensaje de error "caracteres ilegales en la ruta"? Esto (abajo) es el XML devuelto por el servicio. Simplemente quiero obtener la lista de competiciones y ponerlas en una lista que tengo configurada. Sin embargo, el XML se carga en un documento XML, por lo que debe estar correctamente formateado.XML caracteres no válidos en ruta

Algún consejo sobre la mejor manera de hacer esto y recibir todo el año el error sería muy apreciada.

<?xml version="1.0" ?> 
- <gsmrs version="2.0" sport="soccer" lang="en" last_generated="2010-08-27 20:40:05"> 
- <method method_id="3" name="get_competitions"> 
    <parameter name="area_id" value="1" /> 
    <parameter name="authorized" value="yes" /> 
    <parameter name="lang" value="en" /> 
    </method> 
    <competition competition_id="11" name="2. Bundesliga" soccertype="default" teamtype="default" display_order="20" type="club" area_id="80" last_updated="2010-08-27 19:53:14" area_name="Germany" countrycode="DEU" /> 
    </gsmrs> 

Aquí está mi código, que necesito para poder consultar los datos en un xdoc:

string theXml = myGSM.get_competitions("", "", 1, "en", "yes"); 
XmlDocument myDoc = new XmlDocument(); 
MyDoc.LoadXml(theXml); 
XDocument xDoc = XDocument.Load(myDoc.InnerXml); 
+0

dónde están los caracteres '-' viene? ¿Es un error de copiar/pegar o está en el XML real? – Oded

+0

@Oded Supongo que provienen de copiar y pegar el XML de IE de la vista XML de VS. –

+0

Sí, he copiado de XMLVisualier en Visual Studio – Kevin

Respuesta

179

Usted no muestra su código fuente, sin embargo, creo que lo que está haciendo es este :

string xml = ... retrieve ...; 
XmlDocument doc = new XmlDocument(); 
doc.Load(xml); // error thrown here 

El método Load espera un nombre de archivo no un propio XML. Para cargar un XML real, sólo tiene que utilizar el método LoadXml:

... same code ... 
doc.LoadXml(xml); 

Del mismo modo, utilizando el método XDocumentLoad(string) espera un nombre de fichero , no un XML real. Sin embargo, no hay LoadXml método, por lo que la forma correcta de cargar el XML de una cadena es la siguiente:

string xml = ... retrieve ...; 
XDocument doc; 
using (StringReader s = new StringReader(xml)) 
{ 
    doc = XDocument.Load(s); 
} 

Como cuestión de hecho, cuando el desarrollo de cualquier cosa, es una muy buena idea prestar atención a los semántica (significado) de los parámetros no sólo sus tipos. Cuando el tipo de un parámetro es un string esto no significa que uno puede alimentarse en cualquier cosa que es una cadena.

También con respecto a su pregunta actualizada, no tiene sentido usar XmlDocument y XDocument al mismo tiempo. Elija uno u otro.

+2

Gracias por la respuesta. Esto funciona para cargarlo en un XMLDocument pero sigo obteniendo los caracteres ilegales en la ruta si intento cargar este XML en un XDoc para consultar los datos. ¿Algunas ideas? string theXml = myGSM.get_competitions ("", "", 1, "en", "yes"); XmlDocument myDoc = new XmlDocument(); myDoc.LoadXml (theXml); XDocument xDoc = XDocument.Load (myDoc.InnerXml); – Kevin

+0

Lamento la primera vez que utilicé Stackoverflow por lo que tuve problemas para agregar y formatear mis respuestas, como puede ver. – Kevin

+0

@Kevin ver mi respuesta actualizada. –

2

Si esto es realmente su salida XML es ilegal debido a los caracteres menos ('-'). Sospecho que ha cortado y pegado esto desde un navegador como IE. Debe mostrar el XML exacto de un editor de texto, no de un navegador.

+0

He copiado y pegado desde XML Visualier en VS 2010, estos son solo para expandir los nodos XML ¿no es así? – Kevin

+0

@Kevin Es casi imposible depurar los caracteres una vez que han pasado por la pantalla del navegador. Es posible que un personaje ilegal se haya transformado en otra cosa. Sospecho que el verdadero motivo está más cerca de @Ondrej Tucny, pero siempre es esencial saber el XML exacto. Por ejemplo, un espacio al principio del documento sería ilegal, aunque probablemente obtendría un mensaje de error diferente. –

+0

Muchas gracias por esta información @ peter.murray.rust Lo tendré en cuenta en el futuro. Todo lo mejor. – Kevin

8

El seguimiento de la respuesta de Ondrej Tucny: Método

Si desea utilizar una cadena XML en su lugar, se puede utilizar un XElement, y llamar a la "analizar". (Dado que para sus necesidades, y XElement XDocument serían satisfacer sus necesidades)

Por ejemplo;

string theXML = '... get something xml-ish...'; 
XElement xEle = XElement.Parse(theXML); 

// do something with your XElement 

método Parse de la XElement permite pasar de una cadena XML, mientras que el método de carga necesita un nombre de archivo.

+0

Gracias @Harvey Darvey Esto fue útil – abhi

1

Por qué no

XDocument.Parse(theXml); 

Supongo que esto será la solución adecuada

Cuestiones relacionadas