Wie werden Leerzeichen im XML-Objektmodell behandelt?
Manchmal zeigt das XML-Objektmodell TEXT-Knoten an, die Leerzeichen enthalten. Wenn Leerzeichen abgeschnitten werden, kann dies zu Verwirrung führen. Zum Beispiel das folgende XML-Beispiel:
]>
Schmied
John
Der folgende Baum wird generiert:
Verarbeitungsanweisung: xml
DocType: Person
ELEMENT: Person
TEXT:
ELEMENT: Nachname
TEXT:
ELEMENT: Vorname
TEXT:
Der Vor- und Nachname ist von TEXT-Knoten umgeben, die nur Leerzeichen enthalten, da das Inhaltsmodell des Elements „person“ MIXED ist; es enthält das Schlüsselwort #PCDATA. Das MIXED-Inhaltsmodell gibt an, dass zwischen Elementen Text vorhanden sein kann. Daher ist auch Folgendes richtig:
Mein Nachname ist Smith und mein Vorname ist
John
Das Ergebnis ist ein Baum ähnlich dem folgenden:
ELEMENT: Person
TEXT: Mein Nachname ist
ELEMENT: Nachname
TEXT: und mein Vorname ist
ELEMENT: Vorname
TEXT:
Ohne die Leerzeichen nach und vor dem Wort „is“ und die Leerzeichen nach und vor dem Wort „and“ wäre der Satz unverständlich. Daher sind für das MIXED-Inhaltsmodell alle Textkombinationen, Leerzeichen und Elemente relevant. Dies ist bei nicht-MIXED-Content-Modellen nicht der Fall.
Um zu verhindern, dass TEXT-Knoten, die nur aus Leerzeichen bestehen, verschwinden, entfernen Sie das Schlüsselwort #PCDATA aus der Elementdeklaration „person“:
Das Ergebnis ist der folgende klare Baum:
Verarbeitungsanweisung: xml
DocType: Person
ELEMENT: Person
ELEMENT: Nachname
ELEMENT: Vorname
Was bewirkt die XML-Deklaration?
Die XML-Deklaration muss oben im XML-Dokument aufgeführt werden:
Sie gibt die folgenden Elemente an:
Das Dokument ist ein XML-Dokument. MIME-Detektoren können damit erkennen, ob eine Datei vom Typ text/xml ist, wenn der MIME-Typ fehlt oder nicht angegeben wurde.
Das Dokument entspricht der XML 1.0-Spezifikation. Dies wird in Zukunft wichtig sein, wenn es andere Versionen von XML gibt.
Zeichenkodierung für Dokumente. Das Kodierungsattribut ist optional und standardmäßig auf UTF-8 eingestellt.
Hinweis: Die XML-Deklaration muss in der ersten Zeile des XML-Dokuments stehen, daher
erzeugt die folgende XML-Datei den folgenden Parsing-Fehler:
Ungültige XML-Deklaration.
Zeile 0000002:
Standort 0000007: ------^
Hinweis: Die XML-Deklaration ist optional. Wenn Sie oben Kommentare oder Verarbeitungsanweisungen angeben müssen, geben Sie keine XML-Deklaration ein. Die Standardkodierung ist jedoch UTF-8.
Wie drucke ich mein XML-Dokument in einem lesbaren Format?
Wenn Sie ein Dokument von Grund auf erstellen und mithilfe des DOM eine XML-Datei erstellen, steht alles in einer Zeile ohne Leerzeichen dazwischen. Dies ist das Standardverhalten.
Konstruiert das Standard-XSL-Stylesheet in Internet Explorer 5, um XML-Dokumente in einem lesbaren Format anzuzeigen und zu drucken. Wenn beispielsweise IE5 bereits installiert ist, schauen Sie sich die Datei nospace.xml an. Der folgende Baum sollte im Browser erscheinen:
-
-
XYZ
12.56
In XML wurden keine Leerzeichen eingefügt.
Das Drucken von lesbarem XML ist sehr interessant, insbesondere wenn es DTDs gibt, die verschiedene Arten von Inhaltsmodellen definieren. Beispielsweise können Sie im Rahmen des gemischten Inhaltsmodells (#PCDATA) keine Leerzeichen einfügen, da dies die Bedeutung des Inhalts ändern könnte. Betrachten Sie beispielsweise das folgende XML:
Elephant
Dies sollte am besten nicht wie folgt ausgegeben werden:
E
lefant
Denn die Wortgrenzen stimmen nicht mehr.
All dies macht automatisiertes Drucken problematisch. Wenn Sie kein lesbares XML drucken müssen, können Sie das DOM verwenden, um Leerzeichen als Textknoten an geeigneten Stellen einzufügen.
Wie verwende ich Namespaces in DTD? Um einen Namespace in einer DTD zu verwenden, deklarieren Sie ihn in der ATTLIST-Deklaration des Elements, das ihn verwendet, wie folgt:
Der Namespace-Typ muss #FIXED sein. Das Gleiche gilt für Attribut-Namespaces:
Namespaces und XML-Schemas. DTDs und XML-Schemas können nicht gemischt werden. Zum Beispiel das Folgende
xmlns:x CDATA #FIXED „x-schema:myschema.xml“
Führt nicht dazu, dass die in myschema.xml definierte Schemadefinition verwendet wird. Die Verwendung von DTD- und XML-Schemas schließt sich gegenseitig aus.
Wie verwende ich XMLDSO in Visual Basic?
Verwenden Sie das folgende XML als Beispiel:
Mark Hanson
206 765 4583
Jane Smith
425 808 1111
Sie können eine Bindung an ein ADO-Recordset wie folgt durchführen:
Erstellen Sie ein neues VB 6.0-Projekt.
Fügen Sie Verweise auf Microsoft ActiveX Data Objects 2.1 oder höher, Microsoft Data Adapter Library und Microsoft XML Version 2.0 hinzu.
Verwenden Sie den folgenden Code, um XML-Daten in das XML-DSO-Steuerelement zu laden:
Dimmen Sie dso als neues XMLDSOControl
Dokument als IXMLDOMDocument dimmen
Legen Sie doc = dso.XMLDocument fest
doc.Load („d:test.xml“)
verwendet den folgenden Code, um das DSO mithilfe des DataAdapter einem neuen Recordset-Objekt zuzuordnen:
Dim da As New DataAdapter
Setze da.Object = dso
Dim rs As New ADODB.Recordset
Setze rs.DataSource = da
Zugangsdaten:
MsgBox rs.Fields("name").Value
ergibt die Zeichenfolge „Mark Hanson“
Wie verwende ich XML DOM in Java?
Die IE5-Version von MSXML.DLL muss installiert sein. Wählen Sie in Visual J++ 6.0 im Menü „Projekt“ die Option „COM-Wrapper hinzufügen“ und dann „Microsoft XML 1.0“ aus der COM-Objektliste aus. Dadurch wird der erforderliche Java-Wrapper in einem neuen Paket namens „msxml“ erstellt. Diese vorgefertigten Java-Wrapper stehen auch zum Download zur Verfügung. Klassen können wie folgt verwendet werden:
import com.ms.com.*;
msxml importieren.*;
öffentliche Klasse Klasse1
{
public static void main (String[] args)
{
DOMDocument doc = new DOMDocument();
doc.load(new Variant(" file://d:/samples/ot.xml "));
System.out.println("Loaded " + doc.getDocumentElement().getNodeName());
}
}
Das Codebeispiel lädt die 3,8 MB große Testdatei „ot.xml“ aus dem Sun-Religion-Beispiel. Die Variant-Klasse umschließt den Win32-Basistyp VARIANT.
Da Sie jedes Mal, wenn Sie einen Knoten abrufen, tatsächlich einen neuen Wrapper erhalten, können Sie für Knoten keine Zeigervergleiche verwenden. Verwenden Sie also nicht den folgenden Code.
IXMLDOMNode root1 = doc.getDocumentElement();
IXMLDOMNode root2 = doc.getDocumentElement();
if (root1 == root2)...
Verwenden Sie stattdessen den folgenden Code:
if (ComLib.isEqualUnknown(root1, root2)) ....
Die Gesamtgröße des .class-Wrappers beträgt ca. 160 KB. Für eine vollständige Konformität mit der W3C-Spezifikation sollten jedoch nur IXMLDOM*-Wrapper verwendet werden. Die folgenden Klassen sind alte IE 4.0 XML-Schnittstellen und können aus dem msxml-Ordner entfernt werden:
IXMLAttribute*,
IXMLDocument*, XMLDocument*
IXMLElement*,
IXMLError*,
IXMLElementCollection*,
tagXMLEMEM_TYPE*
_xml_error*
Dadurch reduziert sich die Größe auf 147 KB. Sie können auch die folgenden Elemente löschen:
DOMFreeThreadedDocument
Greifen Sie über mehrere Threads in Java-Anwendungen auf XML-Dokumente zu.
XMLHttpRequest
Verwenden Sie die HTTP-Erweiterung XML DAV, um mit dem Server zu kommunizieren.
IXTLRuntime
Definieren Sie das XSL-Stylesheet-Skriptobjekt.
XMLDSOControl
Bindet an XML-Daten in einer HTML-Seite.
XMLDOMDocumentEvents
Rückruf während der Analyse.
Dadurch reduziert sich die Größe auf 116 KB. Um es noch kleiner zu machen, bedenken Sie, dass das DOM selbst zwei Schichten hat: Die Kernschicht besteht aus:
DOMDocument, IXMLDOMDocument
IXMLDOMNode*
IXMLDOMNodeList*
IXMLDOMNamedNodeMap*
IXMLDOMDocumentFragment*
IXMLDOMImplementierung
IXMLDOMParseError
Und DTD-Informationen, die Benutzer möglicherweise aufbewahren müssen:
IXMLDOMDocumentType
IXMLDOMEntity
IXMLDOMNotation
Alle Knotentypen in einem XML-Dokument sind IXMLDOMNodes, die die volle Funktionalität bieten, es gibt jedoch Wrapper auf höherer Ebene für jeden Knotentyp. Wenn Sie daher den DOMDocument-Wrapper ändern und diese spezifischen Typen so ändern, dass sie IXMLDOMNode verwenden, können alle folgenden Schnittstellen entfernt werden:
IXMLDOMAttribute
IXMLDOMCDATASection
IXMLDOMCharacterData
IXMLDOMComment
IXMLDOMElement
IXMLDOMProcessingInstruction
IXMLDOMEntityReference
IXMLDOMText
Wenn Sie diese entfernen, wird die Größe auf 61 KB reduziert. Für IXMLDOMElement sind jedoch sowohl die Methoden getAttribute als auch setAttribute nützlich. Andernfalls müssen Sie Folgendes verwenden:
IXMLDOMNode.getAttributes().setNamedItem(...)