Lesen von XML mit einem "& amp;" in C # XMLDocument-Objekt
Ich geerbt haben, eine schlecht geschriebene web-Anwendung zu haben scheint-Fehler, wenn er versucht zu Lesen, in einem xml-Dokument in der Datenbank gespeichert, die ein "&". Zum Beispiel wird es einen tag mit dem Inhalt: "Prepaid & Charge". Ist es ein Geheimnis einfache Sache zu tun zu haben, die es nicht bekommen, Fehler analysieren, die Zeichen, oder übersehe ich hier etwas offensichtliches?
BEARBEITEN:
Gibt es irgendwelche andere Zeichen, die bewirken, dass diese gleiche Art von parser-Fehler für nicht gut gebildet?
InformationsquelleAutor der Frage Ryan Skarin | 2008-09-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass das xml nicht wohlgeformt ist. Richtig generierte xml-würde-Liste, dass Daten wie diese:
Habe ich fix hatte das gleiche problem vor, und ich habe es mit diesem regex:
Verbinden das mit einer string-Konstante wie folgt definiert:
Jetzt können Sie einfach sagen:
badAmpersand.Replace(<your input>, goodAmpersand);
Beachten, dass eine einfache
String.Replace("&", "&")
ist nicht gut genug, da kann man nicht im Voraus wissen, für ein bestimmtes Dokument, ob alle & - Zeichen werden codiert werden, richtig, falsch, oder sogar beide in das gleiche Dokument.Sind die Fänge hier sind, dass Sie müssen dies tun, um Ihr xml-Dokument vor laden in Ihre parser, der wahrscheinlich bedeutet, dass eine zusätzliche pass-through. Auch spielt es keine Rechnung für kaufmännische und-Zeichen innerhalb eines CDATA-Abschnitt. Endlich, es nur fängt kaufmännische und-Zeichen, nicht andere ungültigen Zeichen wie <. Update: basierend auf dem Kommentar, ich aktualisieren den Ausdruck in hex-codiert (&#x...;) Entitäten auch.
In Bezug auf die Zeichen, die Probleme verursachen können, die eigentlichen Regeln sind etwas Komplex. Zum Beispiel, bestimmte Zeichen dürfen in Daten, aber nicht wie der erste Buchstabe eines Elementes name. Und es gibt keine einfache Liste der ungültigen Zeichen. Stattdessen wird ein großes (nicht-zusammenhängende) Fläche von UNICODE ist definiert als rechtliche, und alles außerhalb davon ist illegal.
So, wenn es darauf ankommt, Sie haben zu Vertrauen, Ihre Dokument-Quelle, mindestens eine bestimmte Menge an compliance-und Konsistenz. Ich habe zum Beispiel festgestellt, dass Menschen sind oft intelligent genug, um sicherzustellen, dass die tags ordnungsgemäß funktioniert und die Flucht <, auch wenn Sie nicht wissen, dass & ist nicht erlaubt, daher dein problem heute. Allerdings die beste Sache wäre, um dieses Problem an der Quelle.
Oh, und ein Hinweis über die CDATA-Vorschlag: ich würde verwenden, um sicherzustellen, dass xml, die ich bin erstellen wohlgeformt ist, aber beim Umgang mit bestehenden xml-von außen finde ich die regex-Methode einfacher.
InformationsquelleAutor der Antwort Joel Coehoorn
Die web-Anwendung ist nicht Schuld, das XML-Dokument ist. Kaufmännische und-Zeichen, die in XML codiert werden sollten, wie
&
. Versagen zu tun, so wird ein syntax-Fehler.Edit: in Antwort auf die Nachfolge-Frage, ja es gibt alle Arten von ähnlichen Fehlern. Zum Beispiel, unsymmetrisch-tags, nicht-weniger-als-Zeichen, nicht börsennotierte Werte des Attributs, Bytes außerhalb der Zeichenkodierung und verschiedene Unicode-Merkwürdigkeiten, unerkannte entity-Referenzen, und so weiter. Um jeder anständige XML-parser zu konsumieren, ein Dokument, muss das Dokument wohlgeformt. Die XML-Spezifikation erfordert, dass ein parser der Begegnung mit einem fehlerhaften Dokument werfen, ist ein schwerwiegender Fehler.
InformationsquelleAutor der Antwort Jim
Die anderen Antworten sind alle richtig, und ich Stimme mit Ihrer Beratung, aber lassen Sie mich eines hinzufügen:
BITTE machen Sie keine Anwendungen, die Arbeit mit nicht wohlgeformten XML -, es macht einfach den rest unseres Lebens mehr schwer :).
Zugegeben, es gibt Zeiten, wenn Sie wirklich nicht haben eine Wahl wenn Sie keine Kontrolle über die andere end, aber Sie sollten wirklich haben, es wirft einen fatal error und beschwerte sich sehr laut und explizit über das, was ist kaputt, wenn ein solches Ereignis Auftritt.
Wahrscheinlich könnte man noch einen Schritt weiter gehen und sagen: "Huch! Dieses XML ist gebrochen in diesen Orten und aus diesen Gründen, ist hier, wie ich versuchte, es zu beheben, machen Sie es gut-gebildet: ...".
Ich bin nicht allzu vertraut mit den MSXML-APIs, aber die meisten guten XML-Parser wird Ihnen erlauben, zu installieren, error-Handler, so dass Sie abfangen können, die genaue Zeile/Spalte mit der Nummer, wo Fehler auftreten, die zusammen mit der Fehler-code und die Nachricht.
InformationsquelleAutor der Antwort Chris Ingrassia
Ihre Datenbank nicht enthalten XML-Dokumente. Es enthält einige wohlgeformte XML-Dokumente und einige Zeichenfolgen, die Aussehen wie XML zu einem Menschen.
Wenn es überhaupt möglich ist, sollten Sie dieses Problem beheben, insbesondere, sollten Sie beheben, was Prozess ist die Generierung der fehlerhaften XML-Dokumente. Fixieren Sie das Programm, das liest die Daten aus dieser Datenbank ist nur darum Tapete über einen Riss in der Wand.
InformationsquelleAutor der Antwort Robert Rossney
Kann man ersetzen & mit
&
Oder Sie vielleicht auch in der Lage sein zu verwenden CDATA Abschnitte.
InformationsquelleAutor der Antwort Steve g
Gibt es mehrere Zeichen, die bewirken, dass die XML-Daten gemeldet werden, als schlecht gebildet.
Vom w3schools:
Die beste Lösung für die Eingabe, die Sie nicht Vertrauen können, werden XML-konform ist, wickeln Sie es in CDATA-tags, z.B.
Alles innerhalb der
<![CDATA[
und]]>
tags ignoriert der parser.InformationsquelleAutor der Antwort ConroyP