Das Zeichen ':', Hexadezimalwert 0x3A, kann nicht in einen Namen aufgenommen werden

78

Ich habe eine XML-Datei, die ihr Element wie enthält

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

Wenn ich versuche, mit dem Code darauf zuzugreifen:

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

Es gibt mir diesen Fehler:

System.Web.Services.Protocols.SoapException: Der Server konnte die Anforderung nicht verarbeiten. ---> System.Xml.XmlException: Das Zeichen ':', Hexadezimalwert 0x3A, kann nicht in einen Namen aufgenommen werden.

Wie soll ich darauf zugreifen?

coure2011
quelle
Sie haben sicherlich eine Möglichkeit, mit Namespaces umzugehen, sodass Sie sie nicht in den Namen einfügen müssen (oder in diesem Fall nicht). Sie sollten in diese Richtung schauen.
p4bl0
2
Die XML-Spezifikation besagt nicht nur, dass ":" für Namen zulässig ist (und um Namen zu starten!), Sondern die Get-Methode von XName dokumentiert nicht, dass sie eine XmlException auslöst!
yoozer8
Siehe auch stackoverflow.com/questions/8324960/… für die korrekte Behandlung von Namespaces.
Polluks

Antworten:

116

Wenn Sie Namespaces verwenden möchten, macht LINQ to XML das wirklich einfach:

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

Suchen Sie xmlns:ab=...in Ihrem Dokument nach einem Abschnitt, um herauszufinden, auf welchen Namespace-URI "ab" verweist.

Jon Skeet
quelle
2
Es funktioniert, aber das Problem ist, dass der Wert von xmlns: ab dynamisch basierend auf dem Zeitstempel generiert wird. Wie kann ich seinen Wert erhalten?
coure2011
6
@ coure06: Der Namespace-URI ist dynamisch? Das ist ziemlich komisch. Aber ja, Sie können es erhalten, indem Sie den Attributwert für XNamespace.Xmlns + "ab"jedes Element ermitteln, das ihn deklariert.
Jon Skeet
Ich erhalte
Si8
Interessanterweise scheint dies nicht mit der neueren Syntax für String-Vorlagen zu funktionieren, daher $"{ab}test"gibt es den gleichen Fehler
Liam
2
@Liam: Ich würde erwarten, dass - ab + "test"keine String-Verkettung durchführt; Es verwendet den +(XNamespace, string)Operator, um eine zu erstellen XName.
Jon Skeet
22

Versuchen Sie, Ihren Namespace in {... }wie folgt einzufügen :

string xfaNamespace = "{http://www.xfa.org/schema/xfa-template/2.6/}";
Serj Sagan
quelle
1
Warum sollten Sie geschweifte Klammern verwenden? Was ist der Vorteil?
Barrypicker
Die Verwendung der XNamespaceMethode erledigt dies im Wesentlichen nur für Sie. .ToStringauf einem XNamespaceoffensichtlich nur formatiert die Zeichenfolge für Sie richtig. Das ist also dasselbe, was auf eine andere Art und Weise gemacht wird, es gibt auch keinen Vorteil
Liam
18

Ich hatte den gleichen Fehler. Ich habe festgestellt, dass ich Code hinzugefügt habe ...

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

... aber ab war entschlossen, eine Zeichenfolge zu sein. Dies verursachte den von OP gemeldeten Fehler. Anstatt das Schlüsselwort VAR zu verwenden, habe ich den tatsächlichen Datentyp XNamespace verwendet ...

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

... und das Problem ging weg.

Barrypicker
quelle
7

Es gibt eine Überladung der Get-Methode, die Sie möglicherweise ausprobieren möchten und die den Namespace berücksichtigt. Versuche dies:

XElement tempElement = doc.Descendants(XName.Get("test", "ab")).FirstOrDefault();
Blair Scott
quelle
1
abist hier jedoch nicht der eigentliche Namespace - es ist nur der Alias ​​für den Namespace. (Ich kenne leider nicht die richtige Terminologie.) LINQ to XML macht dies einfach XNamespace. Es ist selten, dass Sie XName.GetLINQ to XML explizit aufrufen müssen .
Jon Skeet
5

Versuchen Sie, den Namespace aus dem Dokument abzurufen

var ns = doc.Root.Name.Namespace;
Jason Dias
quelle