Pregunta

Tengo algunos datos XML (similar a la de la muestra más abajo) y quiero leer los valores en el código.

¿Por qué estoy obligado a especificar el espacio de nombres predeterminado para acceder a cada elemento?Yo habría esperado que el espacio de nombres predeterminado que se utilizará para todos los elementos.

Es allí una manera más lógica para lograr mi objetivo?

XML de ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<ReceiptsBatch xmlns="http://www.secretsonline.gov.uk/secrets">
    <MessageHeader>
        <MessageID>00000173</MessageID>
        <Timestamp>2009-10-28T16:50:01</Timestamp>
        <MessageCheck>BX4f+RmNCVCsT5g</MessageCheck>
    </MessageHeader>
    <Receipts>
        <Receipt>
            <Status>OK</Status>
        </Receipt>
    </Receipts>
</ReceiptsBatch>

Código para leer los elementos xml estoy después de:

XDocument xDoc = XDocument.Load( FileInPath );

XNamespace ns = "http://www.secretsonline.gov.uk/secrets";

XElement MessageCheck = xDoc.Element(ns+ "MessageHeader").Element(ns+"MessageCheck");
XElement MessageBody = xDoc.Element("Receipts");
¿Fue útil?

Solución

La teoría es que el significado del documento no se ve afectado por la elección de los prefijos de espacio de nombres del usuario.Siempre que los datos estén en el espacio de nombres http://www.secretsonline.gov.uk/secrets, no importa si el autor elige usar el prefijo "s", "secretos", "_x.cafe.babe" o el prefijo "nulo" (es decir, convirtiéndolo en el espacio de nombres predeterminado).A tu aplicación no debería importarle: solo importa el URI.Es por eso que su aplicación debe especificar el URI.

Otros consejos

Según lo sugerido por esta respuesta , puede hacerlo eliminando todos los espacios de nombres de la copia en memoria del documento..Supongo que esto solo debería hacerse si sabe que no tendrá colisiones de nombres en el documento resultante.

/// <summary>
/// Makes parsing easier by removing the need to specify namespaces for every element.
/// </summary>
private static void RemoveNamespaces(XDocument document)
{
    var elements = document.Descendants();
    elements.Attributes().Where(a => a.IsNamespaceDeclaration).Remove();
    foreach (var element in elements)
    {
        element.Name = element.Name.LocalName;

        var strippedAttributes =
            from originalAttribute in element.Attributes().ToArray()
            select (object)new XAttribute(originalAttribute.Name.LocalName, originalAttribute.Value);

        //Note that this also strips the attributes' line number information
        element.ReplaceAttributes(strippedAttributes.ToArray());
    }
}

Puede utilizar Propiedad XmlTextReader.Namespaces para deshabilitar los espacios de nombres mientras se lee el archivo XML.

string filePath;
XmlTextReader xReader = new XmlTextReader(filePath);
xReader.Namespaces = false;
XDocument xDoc = XDocument.Load(xReader);

Así es como funciona Linq-To-Xml.No puede encontrar ningún elemento, si no está en el espacio de nombres predeterminado, y lo mismo ocurre con sus descendientes.La forma más rápida de deshacerse del espacio de nombres es eliminar el enlace al espacio de nombres de su XML inicial.

Tenga en cuenta que el elemento Receipts es también en el espacio de nombres http://www.secretsonline.gov.uk/secrets, por lo que el XNamespace también sería necesaria para el acceso al elemento:

XElement MessageBody = xDoc.Element(ns + "Receipts");

Como una alternativa al uso de espacios de nombres tenga en cuenta que usted puede utilizar "espacio de nombres" agnósticos " el uso de xpath local-name() y namespace-uri(), por ejemplo,

/*[local-name()='SomeElement' and namespace-uri()='somexmlns']

Si se omite el namespace-uri predicado:

/*[local-name()='SomeElement']

Podría coincidir con el ns1:SomeElement y ns2:SomeElement etc.OMI yo siempre prefiero XNamespace donde sea posible, y los casos de uso para el espacio de nombres independiente xpath son bastante limitadas, por ejemplo,para el análisis de elementos específicos en los documentos desconocidos con los esquemas (por ejemplo,dentro de un bus de servicio), o de mejor esfuerzo de análisis de los documentos donde el espacio de nombres puede cambiar (por ejemplo,preparación para el futuro, donde la xmlns cambios para ajustarse a una nueva versión del documento de esquema)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top