Caracterul „:”, cu valoarea hexazecimală 0x3A, nu poate fi inclus într-un nume. (Programare, C#, Xml, Linq, Linq La Xml)

coure2011 a intrebat.

Am un fișier xml care conține un element de tipul

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

Când încerc să îl accesez folosind codul:

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

Îmi dă această eroare:

System.Web.Services.Protocols.SoapException: Serverul nu a putut procesa cererea. —> System.Xml.XmlException: Caracterul ‘:’, cu valoarea hexazecimală 0x3A, nu poate fi inclus într-un nume.

Cum ar trebui să îl accesez?

Comentarii

  • Cu siguranță aveți o modalitate de a gestiona spațiile de nume astfel încât să nu trebuie (sau, în acest caz, să nu puteți) să le introduceți în nume. Ar trebui să vă uitați în această direcție. –  > Por p4bl0.
  • Nu numai că specificația XML spune că „:” este este permis pentru nume (și pentru a începe numele!), dar și Metoda Get de XName nu precizează că aceasta aruncă o excepție XmlException! –  > Por yoozer8.
  • Consultați, de asemenea, stackoverflow.com/questions/8324960/… pentru gestionarea corectă a spațiilor de nume. –  > Por Polluks.
5 răspunsuri
Jon Skeet

Dacă doriți să utilizați spații de nume, LINQ to XML face acest lucru foarte ușor:

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

Căutați un xmlns:ab=... în documentul dvs. pentru a afla la ce spațiu de nume se referă URI „ab”.

Comentarii

  • Funcționează, dar problema este că valoarea lui xmlns:ab este generată dinamic pe baza timbrului de timp. Cum pot obține valoarea sa? –  > Por coure2011.
  • @coure06: URI-ul spațiului de nume este dinamic? Este destul de ciudat. Dar da, îl puteți obține găsind valoarea atributului pentru XNamespace.Xmlns + "ab" din orice element care îl declară. –  > Por Jon Skeet.
  • Primesc această eroare: stackoverflow.com/questions/42839628/… –  > Por Si8.
  • Interesant este că acest lucru nu pare să funcționeze cu cea mai nouă sintaxă de modelare a șirurilor de caractere, deci $"{ab}test" dă aceeași eroare –  > Por Liam.
  • @Liam: Mă așteptam să se întâmple asta – ab + "test" nu realizează concatenarea șirurilor de caractere; utilizează +(XNamespace, string) pentru a crea un fișier XName. –  > Por Jon Skeet.
Serj Sagan

Încercați să puneți spațiul de nume în {} astfel:

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

Comentarii

  • de ce ar trebui să folosiți paranteze curbe? Care este avantajul? –  > Por barrypicker.
  • Utilizarea XNamespace face acest lucru pentru dumneavoastră. .ToString pe o XNamespace evident, doar formatează corect șirul de caractere pentru dumneavoastră. Deci, acesta este același lucru făcut într-un mod diferit, nu există niciun beneficiu în nici unul dintre ele –  > Por Liam.
barrypicker

Am avut aceeași eroare. Am descoperit că adăugam cod…

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

… dar ab a fost determinat ca fiind un șir de caractere. Acest lucru a cauzat eroarea raportată de OP. În loc să folosesc cuvântul cheie VAR, am folosit tipul real de date XNamespace…

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

… și problema a dispărut.

Blair Scott

Există o supraîncărcare a metodei Get pe care ați putea să o încercați și care ia în considerare spațiul de nume. Încearcă asta:

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

Comentarii

  • ab nu este totuși spațiul de nume real aici – este doar un alias pentru spațiul de nume. (Din păcate, nu cunosc terminologia corectă.) LINQ to XML face acest lucru ușor cu XNamespace. Este rar să fie nevoie să apelați în mod explicit XName.Get în LINQ to XML. –  > Por Jon Skeet.
Jason Dias

Încercați să obțineți spațiul de nume din document

var ns = doc.Root.Name.Namespace;