He estado trabajando desde curso de Puralsight sobre los fundamentos de Linq y esta sección vinculada describe la lectura de xml con prefijos de espacio de nombres, pero no puedo hacer que esto funcione.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<OutboundEvent
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:abb.com:assetsuite:IF:Event http://apifw/devifa/xml/GeneralLedger/GeneralLedger.Publish.Event.V940.xsd"
    xmlns="urn:abb.com:assetsuite:IF:Event"
    xmlns:hdr="urn:abb.com:assetsuite:IF:Header"
    xmlns:bo="urn:abb.com:assetsuite:IF:BO"
    xmlns:boe="urn:abb.com:assetsuite:IF:IFExtension"
>
...
    <bo:BusinessObject>
    ...
    </bo:BusinessObject>
</OutboundEvent>

Debería recibir un solo XElement devuelto por el siguiente código, pero no lo soy:

var document = XDocument.Load(path);
var bo = (XNamespace)"urn:abb.com:assetsuite:IF:BO";

var businessobjects =
    from elements in document.Element("OutboundEvent")?.Elements(bo + "BusinessObject") 
        ?? Enumerable.Empty<XElement>()
    select elements;
0
CodenameCain 11 oct. 2017 a las 19:23

2 respuestas

La mejor respuesta

El nodo OutboundEvent está en un espacio de nombres pero su código hace referencia a él como si no lo estuviera. Está en el espacio de nombres urn:abb.com:assetsuite:IF:Event.

XNamespace ns = "urn:abb.com:assetsuite:IF:Event";
XNamespace bo = "urn:abb.com:assetsuite:IF:BO";
var businessObjects =
    document.Elements(ns + "OutboundEvent").Elements(bo + "BusinessObject");
2
Jeff Mercado 11 oct. 2017 a las 17:06

¿No debería definir y utilizar el espacio de nombres predeterminado para el elemento OutboundEvent?

var document = XDocument.Load(path);
var ns = (XNamespace)"urn:abb.com:assetsuite:IF:Event";
var bo = (XNamespace)"urn:abb.com:assetsuite:IF:BO";

var businessobjects =
    from elements in document.Element(ns + "OutboundEvent")?.Elements(bo + "BusinessObject") 
        ?? Enumerable.Empty<XElement>()
    select elements;
1
Dmitry Pavlov 11 oct. 2017 a las 16:35