2011-05-10 34 views
18

Estoy creando un nuevo XDocument de una tabla. Debo validar el documento de un documento XSD y sigue fallando porque agrega xmlns = "" a uno de los Elementos cuando no debería. Aquí hay partes del código que son pertinentes.XElement agrega automáticamente xmlns = "" a sí mismo

XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; 
       XNamespace xmlns = "https://uidataexchange.org/schemas"; 
       XElement EmployerTPASeparationResponse = null; 
       XElement EmployerTPASeparationResponseCollection = new XElement(xmlns + "EmployerTPASeparationResponseCollection", new XAttribute(XNamespace.Xmlns + "xsi", xsi), new XAttribute(xsi + "schemaLocation", "https://uidataexchange.org/schemas SeparationResponse.xsd")); 
       XDocument doc = new XDocument(
       new XDeclaration("1.0", null, "yes"), EmployerTPASeparationResponseCollection); 
    //sample XElement populate Element from database 
    StateRequestRecordGUID = new XElement("StateRequestRecordGUID"); 
         StateRequestRecordGUID.SetValue(rdr["StateRequestRecordGUID"].ToString()); 

    //sample to add Elements to EmployerTPASeparationResponse 
    EmployerTPASeparationResponse = new XElement("EmployerTPASeparationResponse"); 
        if (StateRequestRecordGUID != null) 
        { 
         EmployerTPASeparationResponse.Add(StateRequestRecordGUID); 
        } 

    //the part where I add the EmployerTPASeparationResponse collection to the parent 
    EmployerTPASeparationResponseCollection.Add(EmployerTPASeparationResponse); 

El código anterior produce el siguiente archivo xml.

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<EmployerTPASeparationResponseCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://uidataexchange.org/schemas SeparationResponse.xsd" xmlns="https://uidataexchange.org/schemas"> 
<EmployerTPASeparationResponse xmlns=""> 
    <StateRequestRecordGUID>98761987654321323456109883</StateRequestRecordGUID> 
    </EmployerTPASeparationResponse> 
</EmployerTPASeparationResponseCollection> 

Tenga en cuenta el elemento EmployerTPASeparationResponse. Tiene un atributo xmlns vacío. Lo que quiero pasar es simplemente escribir EmployerTPASeparationResponse sin ningún atributo.

Respuesta

9

Es necesario especificar el espacio de nombres de los elementos que va a agregar. ej

//sample XElement populate Element from database 
StateRequestRecordGUID = new XElement(xmlns + "StateRequestRecordGUID"); 

y

//sample to add Elements to EmployerTPASeparationResponse 
EmployerTPASeparationResponse = new XElement(xmlns + "EmployerTPASeparationResponse"); 
0

Cuando se crea todos los otros elementos (EmployerTPASeparationResponse y StateRequestRecordGUID) debe de incluir el espacio de nombres en el elemento de nombre (de la misma manera que lo hizo en la creación de su EmployerTPASeparationResponseCollection.

+0

el punto es que no quiero que el atributo xmlns en absoluto dentro de la EmployerTPASeparationResponse. ¿Algunas ideas? – Zach

+0

El hecho de que está allí pero con el valor en blanco significa que no está en ningún espacio de nombres (o más bien en blanco). Si elimina el atributo del espacio de nombres (haciendo lo que dije, y según Dustin a continuación), verá que el atributo no estará allí. Aunque la implicación es que esos nodos (y sus hijos a menos que se sobrescriban explícitamente) están en el espacio de nombres de los padres. – Reddog

9

Debe especificar el espacio de nombre para el XElement cuando lo agrega para que coincida con el del XDocument. Esto se puede hacer de la siguiente manera:

XElement employerTPASeperationResponse = 
    new XElement(xmlns + "EmployerTPASeparationResponse"); 
+2

El punto es que no quiero el atributo xmlns en absoluto dentro de EmployerTPASeparationResponse. ¿Algunas ideas? – Zach

+2

@Zach: Agregar lo anterior debe eliminarlo ya que se encuentra debajo de un elemento que ya lo especifica. La arquitectura maneja esa parte para usted. –

+2

¡Eso funcionó! Ahora tengo que incluir xmlns + "ElementName" en cada lugar que agregue un elemento. ¡¡Gracias!! – Zach

3

Hay que crear un XNamespace para el elemento raíz, y luego en la creación del elemento, pone el espacio de nombres de objeto creado, así:

xmlDoc = new XDocument(); 
xmlDoc.Declaration = new XDeclaration("1.0", "utf-8", null); 

XNamespace pageDefinition = @"http://xmlns.oracle.com/adfm/uimodel"; 

XElement root = new XElement(pageDefinition + "pageDefinition", new XAttribute("Package", "oracle.webcenter.portalapp.pages")); 

xmlDoc.Add(root); 

el código anterior producirá el siguiente archivo xml:

<?xml version="1.0" encoding="UTF-8"?> 
<pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel" Package="oracle.webcenter.portalapp.pages"/> 
Cuestiones relacionadas