3 Stimmen

Wie XML mit ungültigen Zeichen in Node Name zu analysieren?

Ich versuche also, eine XML-Datei zu parsen, deren Erstellung nicht meiner Kontrolle unterliegt. Das Problem ist, dass sie irgendwie Knoten haben, die wie folgt aussehen:

<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(MORNINGSTAR) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(QUARTERSTAFF) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(SCYTHE) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(TRATNYR) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(TRIPLE-HEADED_FLAIL) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(WARAXE) />

Sowohl Visual Studio als auch .NET sind der Meinung, dass die Zeichen '(' und ')', wie sie oben verwendet wurden, völlig ungültig sind. Leider muss ich diese Dateien verarbeiten! Gibt es eine Möglichkeit, die Xml-Reader-Klassen dazu zu bringen, beim Anblick dieser Zeichen nicht auszuflippen, oder sie dynamisch zu umgehen? Ich könnte eine Art von Pre-Processing auf die gesamte Datei zu tun, aber ich will die '(' und ')' Zeichen, wenn sie innerhalb des Knotens in irgendeiner gültigen Weise erscheinen, so dass ich nicht wollen, entfernen Sie einfach alle ...

8voto

Marc Gravell Punkte 970173

Das ist einfach nicht gültig. Pre-Processing ist Ihr best-bet, vielleicht mit regex - etwas wie:

string output = Regex.Replace(input, @"(<\w+)\((\w+)\)([ >/])", "$1$2$3");

Bearbeiten: etwas komplizierter, um das "-" innerhalb der Klammern zu ersetzen:

string output = Regex.Replace(input, @"(<\w+)\(([-\w]+)\)([ >/])",
    delegate(Match match) {
        return match.Groups[1].Value + match.Groups[2].Value.Replace('-', '_')
             + match.Groups[3].Value;
    });

3voto

lavinio Punkte 23413

Wenn es nicht syntaktisch gültig ist, ist es kein XML.

XML ist in dieser Hinsicht sehr streng.

Wenn Sie die sendende Anwendung nicht dazu bringen können, korrektes XML zu senden, dann teilen Sie ihr einfach mit, dass was auch immer nachgelagerten Prozess sieht dies wird scheitern egal, ob es Ihre oder eine andere Anwendung in der Zukunft ist.

Wenn eine Vorverarbeitung nicht möglich ist, besteht ein weiterer cleverer Mechanismus darin, die Stream Objekt, das mit einem benutzerdefinierten Stream an den Parser übergeben wird. Dieser Stream könnte suchen nach < Zeichen, und wenn es eines sieht, setzt es eine Markierung. Bis ein > Charakter zu sehen ist, könnte er jeden ( o ) Zeichen. Wir haben etwas Ähnliches verwendet, um NUL- und ^Z-Zeichen loszuwerden, die einer XML-Datei durch einen alten Transportmechanismus hinzugefügt wurden. (Der einzige Haken an der Sache könnte sein < Zeichen innerhalb eines Attributs, da sie dort nicht escaped werden müssen - nur > Zeichen tun.)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X