2010-04-04 1 views
60

Ho un file XML che contiene il suo elemento comeIl carattere ':', valore esadecimale 0x3A, non può essere incluso in un nome

<ab:test>Str</ab:test> 

Quando cerco di accedervi utilizzando il codice:

XElement tempElement = doc.Descendants(XName.Get("ab:test")).FirstOrDefault(); 

E mi sta dando questo errore:

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Xml.XmlException: The ':' character, hexadecimal value 0x3A, cannot be included in a name.

Come devo accedervi?

+0

È sicuramente un modo per gestire gli spazi dei nomi in modo da non dover (o in questo caso, non è possibile) inserirli nel nome. Dovresti guardare in questa direzione. – p4bl0

+1

Non solo le specifiche XML dicono che ":" è [consentito per i nomi] (http://www.w3.org/TR/REC-xml/#NT-NameStartChar) (e per iniziare i nomi!), Ma il [Ottieni metodo] (http://msdn.microsoft.com/en-us/library/bb357369.aspx) di XName non documenta che genera XmlException! – yoozer8

risposta

90

Se si desidera utilizzare gli spazi dei nomi, LINQ to XML rende che davvero semplice:

XNamespace ab = "http://whatever-the-url-is"; 
XElement tempElement = doc.Descendants(ab + "test").FirstOrDefault(); 

Cercare una sezione xmlns:ab=... nel documento per scoprire quali namespace URI "ab" si riferisce a.

+2

Funziona, ma il problema è che il valore di xmlns: ab è generato dinamicamente in base al timestamp. Come posso ottenere il suo valore? – coure2011

+5

@ coure06: l'URI dello spazio dei nomi è dinamico? È piuttosto strano Ma sì, puoi ottenerlo trovando il valore dell'attributo per 'XNamespace.Xmlns +" ab "' da qualsiasi elemento lo dichiari. –

+0

Ho ricevuto questo errore: http://stackoverflow.com/questions/42839628/how-to-get-certain-elements-inside-an-xml-document/42840373#42840373 – Si8

6

Esiste un sovraccarico del metodo Get che è possibile provare che tenga conto dello spazio dei nomi. Prova questo:

XElement tempElement = doc.Descendants(XName.Get("test", "ab")).FirstOrDefault(); 
+1

'ab' non è lo spazio dei nomi effettivo qui però - è solo l'alias per lo spazio dei nomi. (Non conosco la terminologia corretta, purtroppo.) LINQ to XML lo rende facile con 'XNamespace'. È raro che tu debba chiamare esplicitamente 'XName.Get' in LINQ to XML. –

+0

ah errore mio, grazie per il chiarimento –

17

provare a mettere lo spazio dei nomi in { ... } in questo modo:

string xfaNamespace = "{http://www.xfa.org/schema/xfa-template/2.6/}"; 
+1

perché dovresti usare le parentesi graffe? Qual è il vantaggio? – barrypicker

+10

Che lo fa funzionare :) –

+0

Provato che ... non ha funzionato unf: / – Si8

3

Prova a ottenere namespace dal documento

var ns = doc.Root.Name.Namespace; 
10

Stavo facendo lo stesso errore . Ho trovato che aggiungevo codice ...

var ab = "http://whatever-the-url-is"; 

... ma ab è stato determinato per essere una stringa. Ciò ha causato l'errore segnalato da OP. Invece di utilizzare la parola chiave VAR, ho utilizzato il tipo di dati effettivo XNamespace ...

XNamespace ab = "http://whatever-the-url-is"; 

... e il problema è andato via.