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?
c#
xml
linq
linq-to-xml
coure2011
quelle
quelle
Antworten:
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.quelle
XNamespace.Xmlns + "ab"
jedes Element ermitteln, das ihn deklariert.$"{ab}test"
gibt es den gleichen Fehlerab + "test"
keine String-Verkettung durchführt; Es verwendet den+(XNamespace, string)
Operator, um eine zu erstellenXName
.Versuchen Sie, Ihren Namespace in
{
...}
wie folgt einzufügen :string xfaNamespace = "{http://www.xfa.org/schema/xfa-template/2.6/}";
quelle
XNamespace
Methode erledigt dies im Wesentlichen nur für Sie..ToString
auf einemXNamespace
offensichtlich 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 VorteilIch 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.
quelle
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();
quelle
ab
ist 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 einfachXNamespace
. Es ist selten, dass SieXName.Get
LINQ to XML explizit aufrufen müssen .Versuchen Sie, den Namespace aus dem Dokument abzurufen
var ns = doc.Root.Name.Namespace;
quelle