read - write xml c#
Caracteres ilegales XML en la ruta (4)
No muestra su código fuente, sin embargo, supongo que lo que está haciendo es esto:
string xml = ... retrieve ...;
XmlDocument doc = new XmlDocument();
doc.Load(xml); // error thrown here
El método Load
espera que un nombre de archivo no sea un XML en sí mismo. Para cargar un XML real, simplemente use el método LoadXml
:
... same code ...
doc.LoadXml(xml);
De forma similar, al usar XDocument
el XDocument
Load(string)
espera un nombre de archivo , no un XML real. Sin embargo, no hay LoadXml
método LoadXml
, por lo que la forma correcta de cargar el XML desde una cadena es la siguiente:
string xml = ... retrieve ...;
XDocument doc;
using (StringReader s = new StringReader(xml))
{
doc = XDocument.Load(s);
}
De hecho, al desarrollar cualquier cosa, es una muy buena idea prestar atención a la semántica (significado) de los parámetros, no solo a sus tipos. Cuando el tipo de parámetro es una string
, no significa que uno pueda alimentar cualquier cosa que sea una cadena.
También con respecto a su pregunta actualizada, no tiene sentido usar XmlDocument
y XDocument
al mismo tiempo. Elija uno u otro.
Estoy consultando un servicio basado en jabón y deseo analizar el XML devuelto, sin embargo, cuando intento cargar el XML en un XDoc para 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.
Cualquier consejo sobre la mejor manera de hacer esto y evitar el error sería muy apreciado.
<?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, necesito 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);
Por qué no
XDocument.Parse(theXml);
Supongo que esta será la solución correcta
Si este es realmente su resultado, es XML 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.
Siguiendo la respuesta de Ondrej Tucny:
Si desea utilizar una cadena xml en su lugar, puede usar un elemento XElement y llamar al método "analizar". (Dado que para sus necesidades, XElement y XDocument satisfarían sus necesidades)
Por ejemplo ;
string theXML = ''... get something xml-ish...'';
XElement xEle = XElement.Parse(theXML);
// do something with your XElement
El método Parse de XElement le permite pasar una cadena XML, mientras que el método Load necesita un nombre de archivo.