2010-12-10 12 views
12

Todo, Quiero crear un documento xml de sobre de jabón, por ej.¿Cómo configuro un prefijo de espacio de nombres para un XAttribute en .NET?

<soap:Envelope soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding" xmlns:soap="http://www.w3.org/2001/12/soap-envelope"></soap:Envelope> 

estoy usando System.Xml.Linq hacer esto, pero no puedo encontrar la manera de añadir el prefijo soap al atributo encodingStyle.

Hasta ahora, tengo unas pocas cosas:

XNamespace ns = XNamespace.Get("http://www.w3.org/2001/12/soap-envelope"); 
XAttribute prefix = new XAttribute(XNamespace.Xmlns + "soap", ns); 
XAttribute encoding = new XAttribute("encodingStyle", "http://www.w3.org/2001/12/soap-encoding"); 

XElement envelope = new XElement(ns + "Envelope", prefix, encoding); 

que me da

<soap:Envelope encodingStyle="http://www.w3.org/2001/12/soap-encoding" xmlns:soap="http://www.w3.org/2001/12/soap-envelope"></soap:Envelope> 

Se utiliza XAttribute añadir un prefijo a un elemento, se pueden utilizar XAttribute añadir un prefijo a un XAttribute ??

gracias, P

Respuesta

9

especificar el espacio de nombres cuando se crea la 'encodingStyle' XAttribute (mediante el uso de ns + "encodingStyle"):

XAttribute encoding = new XAttribute(ns + "encodingStyle", "http://www.w3.org/2001/12/soap-encoding"); 

El two-parameter XAttribute constructor toma un XName como primer argumento. Esto puede construirse implícitamente desde un string (como en el código de su pregunta), o directamente "agregar" un string a un XNamespace para crear un XName (como se indicó anteriormente).

+1

Gracias. ¿Soy solo yo o se trata de una API realmente mal diseñada? ¿Alguna sobrecarga de operador "inteligente" pero ninguna sobrecarga de constructor hace lo mismo? ¿Qué? –

+0

Tenga en cuenta que el constructor XAttribute toma 'XName'. 'string' tiene una conversión implícita a' XName', pero también puedes crear uno al "agregar" un 'XNamespace' al nombre de una cadena. System.Xml.Linq usa sobrecarga de operador y operadores de conversión implícita/explícita ampliamente; por ejemplo, '(int) elem.Attribute (" count ")' leerá el valor de la cadena del atributo 'count' (en' elem'), lo analizará como un entero y devolverá el valor. No es muy reconocible, pero da como resultado un código muy conciso/concisa/incomprensible (eliminar según corresponda). –

1

Necesita combinar el XName de su XAttribute con un XNamespace. Lo sé bien ... De todos modos prueba esto.

XNamespace soap = "http://www.w3.org/2001/12/soap-envelope"; 
XAttribute encoding = new XAttribute(soap + "encodingStyle", 
    "http://www.w3.org/2001/12/soap-encoding"); 
+0

Tenga en cuenta que ya tiene el XNamespace llamado "ns". Acabo de llamarlo "jabón" para dejar más claro lo que está haciendo. – Josh

Cuestiones relacionadas