2010-04-04 1 views
60

ich eine XML-Datei, die ihr Element enthält wieDie ‚:‘ Zeichen, hexadezimalen Wert 0x3A, kann nicht in einem Namen enthalten sein

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

Wenn ich versuche, darauf zuzugreifen den Code mit:

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

es gibt mir diese Fehlermeldung:

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.

Wie soll ich darauf zugreifen?

+0

Sie haben sicherlich eine Möglichkeit, Namespaces zu behandeln, so dass Sie sie nicht (oder in diesem Fall nicht) in den Namen eingeben müssen. Du solltest in diese Richtung schauen. – p4bl0

+1

Nicht nur sagt die XML-Spezifikation, dass ":" ist [erlaubt für Namen] (http://www.w3.org/TR/REC-xml/#NT-NameStartChar) (und Namen zu starten!), Aber die [Get-Methode] (http://msdn.microsoft.com/en-us/library/bb357369.aspx) von XName dokumentiert nicht, dass es XmlException auslöst! – yoozer8

Antwort

90

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

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

Suchen Sie nach einem xmlns:ab=... Abschnitt in Ihrem Dokument, um herauszufinden, welche NamespaceURI "ab" bezieht sich auf.

+2

Es funktioniert, aber das Problem ist, dass der Wert von xmlns: ab dynamisch basierend auf Zeitstempel generiert wird. Wie kann ich seinen Wert erhalten? – coure2011

+5

@ coure06: Der Namespace-URI ist dynamisch? Das ist ziemlich komisch. Aber ja, Sie können es bekommen, indem Sie den Attributwert für 'XNamespace.Xmlns +" ab "' von jedem Element finden, das es deklariert. –

+0

Ich bekomme diesen Fehler: http://stackoverflow.com/questions/42839628/how-to-get-certain-elements-inside-an-xml-document/42840373#42840373 – Si8

6

Es gibt eine Überladung der Get-Methode, die Sie möglicherweise versuchen möchten, die den Namespace berücksichtigt. Versuchen Sie folgendes:

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

'AB' ist nicht der eigentliche Namespace hier aber - es ist nur der Alias ​​für den Namespace. (Ich kenne die richtige Terminologie leider nicht.) LINQ to XML macht das mit 'XNamespace' einfach. Es ist selten, dass Sie 'XName.Get' explizit in LINQ to XML aufrufen müssen. –

+0

ah mein Fehler, danke für die Klarstellung –

17

Versuchen Sie Ihren Namensraum in { setzen ... } wie so:

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

Warum sollten Sie geschweifte Klammern verwenden? Was ist der Vorteil? – barrypicker

+10

Das macht es funktioniert :) –

+0

Versuchte, dass ... nicht funktioniert unf: / – Si8

3

Try-Namespace aus dem Dokument

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

Ich habe den gleichen Fehler zu erhalten . Ich fand, dass ich Code addierte ...

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

... aber ab war bestimmt, eine Zeichenkette zu sein. Dies hat den von OP gemeldeten Fehler verursacht. Anstatt das Schlüsselwort VAR zu verwenden, habe ich den tatsächlichen Datentyp XNamespace ...

... und das Problem ging weg.

Verwandte Themen