2010-04-04 23 views
60

Tengo un archivo XML que contiene su elemento comoEl ':' carácter, valor hexadecimal 0x3A, no puede ser incluido en un nombre

<ab:test>Str</ab:test> 

Cuando estoy tratando de acceder a él mediante el código:

XElement tempElement = doc.Descendants(XName.Get("ab:test")).FirstOrDefault(); 

me está dando este error:

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Xml.XmlException: The ':' character, hexadecimal value 0x3A, cannot be included in a name.

¿Cómo debería acceder a ella?

+0

Sin duda, tiene una forma de manejar espacios de nombres para que no tenga que (o en este caso, no puede) ponerlos en el nombre. Deberías mirar en esta dirección. – p4bl0

+1

La especificación XML no solo dice que ":" es [permitido para los nombres] (http://www.w3.org/TR/REC-xml/#NT-NameStartChar) (¡y para comenzar nombres!), Pero el [Obtener método] (http://msdn.microsoft.com/en-us/library/bb357369.aspx) de XName no documenta que arroja XmlException! – yoozer8

Respuesta

90

Si desea utilizar espacios de nombres, LINQ to XML hace que realmente fácil:

XNamespace ab = "http://whatever-the-url-is"; 
XElement tempElement = doc.Descendants(ab + "test").FirstOrDefault(); 

Busque una sección xmlns:ab=... en su documento para saber qué URI de espacio "ab" se refiere a.

+2

Funciona, pero el problema es que el valor de xmlns: ab se genera dinámicamente en función de la marca de tiempo. ¿Cómo puedo obtener su valor? – coure2011

+5

@ coure06: ¿el URI del espacio de nombres es dinámico? Eso es bastante raro. Pero sí, puede obtenerlo al encontrar el valor de atributo para 'XNamespace.Xmlns +" ab "' de cualquier elemento que lo declare. –

+0

Recibo este error: http://stackoverflow.com/questions/42839628/how-to-get-certain-elements-inside-an-xml-document/42840373#42840373 – Si8

6

Hay una sobrecarga del método Get que quizás desee probar que tenga en cuenta el espacio de nombres. Prueba esto:

XElement tempElement = doc.Descendants(XName.Get("test", "ab")).FirstOrDefault(); 
+1

'ab' no es el espacio de nombres real aquí, sin embargo, es solo el alias para el espacio de nombres. (Desgraciadamente, no conozco la terminología correcta). LINQ to XML lo hace fácil con 'XNamespace'. Es raro que deba llamar explícitamente a 'XName.Get' en LINQ a XML. –

+0

ah mi error, gracias por la aclaración –

17

trate de poner el espacio de nombres en { ... } así:

string xfaNamespace = "{http://www.xfa.org/schema/xfa-template/2.6/}"; 
+1

¿por qué debería usar llaves? ¿Cuál es el beneficio? – barrypicker

+10

Eso lo hace funcionar :) –

+0

Probé que ... no funcionó no: / – Si8

3

Intentar obtener espacio de nombres del documento

var ns = doc.Root.Name.Namespace; 
10

que estaba teniendo el mismo error . Encontré que estaba agregando código ...

var ab = "http://whatever-the-url-is"; 

... pero se determinó que ab era una cadena. Esto causó el error informado por OP. En lugar de utilizar la palabra clave var, he utilizado el tipo de datos XNamespace real ...

XNamespace ab = "http://whatever-the-url-is"; 

... y el problema desapareció.

Cuestiones relacionadas