2017-10-11 11 views
0

J'ai travaillé à partir de Puralsight course on Linq Fundamentals de Scott Allen et cette section liée décrit la lecture de xml avec des préfixes d'espace de noms, mais je ne suis pas capable de faire ce travail.Linq to XML avec le préfixe d'espace de noms ne fonctionnant pas

<?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> 

Je devrais obtenir un XElement renvoyé par le code suivant, mais je ne suis pas:

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

Ne pas prendre une capture d'écran de _text _... poster le texte actuel. –

+0

Quelle est la meilleure façon de coller en XML qui s'étend sur plusieurs pages alors? – CodenameCain

+0

Collez les parties pertinentes du fichier XML, il n'est pas nécessaire que ce soit le texte intégral. Juste assez pour illustrer le problème. –

Répondre

2

Le nœud OutboundEvent est dans un espace de noms, mais vos références de code comme s'il n'a pas été . Il se trouve dans l'espace de noms 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"); 
+0

Il se trouve dans l'espace de noms par défaut. Mais oui, l'espace de noms par défaut devrait être défini et utilisé aussi. –

+1

Désolé, l'espace de noms par défaut n'était pas le bon mot pour cela. J'oublie comment ça s'appelle. racine? vide? –

1

Vous ne devez pas définir et utiliser l'espace de nom par défaut pour l'élément 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;