XML オブジェクト モデルでは空白文字はどのように処理されますか?
XML オブジェクト モデルには、空白文字を含む TEXT ノードが表示される場合があります。空白文字が切り捨てられると、混乱が生じる可能性があります。たとえば、次の XML の例は次のとおりです。
]>
スミス
ジョン
次のツリーが生成されます。
処理命令:xml
文書タイプ: 人
要素: 人
文章:
要素: 姓
文章:
要素: 名
文章:
「person」要素のコンテンツ モデルは MIXED であり、#PCDATA キーワードが含まれているため、姓と名は空白文字のみを含む TEXT ノードで囲まれます。 MIXED コンテンツ モデルは、要素間にテキストが存在できることを指定します。したがって、次も正しいです。
私の姓はスミス、名はです
ジョン
結果は、次のようなツリーになります。
要素: 人
本文: 私の姓は
要素: 姓
本文: そして私の名前は
要素: 名
文章:
単語「is」の前後の空白文字と、単語「and」の前後の空白文字がなければ、文は理解できなくなります。したがって、MIXED コンテンツ モデルの場合、テキストの組み合わせ、空白文字、および要素はすべて関連します。これは、非 MIXED コンテンツ モデルには当てはまりません。
空白のみの TEXT ノードを非表示にするには、「person」要素宣言から #PCDATA キーワードを削除します。
結果は、次のような明確なツリーになります。
処理命令:xml
文書タイプ: 人
要素: 人
要素: 姓
要素: 名
XML 宣言は何をするのでしょうか?
XML 宣言は XML ドキュメントの先頭にリストする必要があります。XML 宣言では
次の項目を指定します。
ドキュメントは XML ドキュメントです。 MIME 検出器は、これを使用して、MIME タイプが欠落しているか指定されていない場合に、ファイルのタイプが text/xml であるかどうかを検出できます。
このドキュメントは XML 1.0 仕様に準拠しています。これは、将来、XML の他のバージョンが登場したときに重要になります。
ドキュメントの文字エンコーディング。エンコーディング属性はオプションであり、デフォルトは UTF-8 です。
注: XML 宣言は XML ドキュメントの最初の行にある必要があるため、次の XML ファイルでは
次の解析エラーが生成されます:
無効な XML 宣言。
行0000002:
場所 0000007: ------^
注: XML 宣言はオプションです。コメントや処理命令を先頭に指定する必要がある場合は、XML 宣言を記述しないでください。ただし、デフォルトのエンコードは UTF-8 になります。
XML ドキュメントを読み取り可能な形式で印刷するにはどうすればよいですか?
DOM を使用してドキュメントを最初から作成して XML ファイルを作成する場合、すべてが 1 行に記述され、間にスペースは入りません。これはデフォルトの動作です。
Internet Explorer 5 でデフォルトの XSL スタイルシートを構築し、XML ドキュメントを読み取り可能な形式で表示および印刷します。たとえば、IE5 がすでにインストールされている場合は、nospace.xml ファイルを調べてください。次のツリーがブラウザに表示されるはずです:
-
-
XYZ
12.56
XML に空白文字は挿入されません。
読み取り可能な XML を印刷することは、特にさまざまなタイプのコンテンツ モデルを定義する DTD がある場合に非常に興味深いものです。たとえば、混合コンテンツ モデル (#PCDATA) では、コンテンツの意味が変わる可能性があるため、スペースを挿入できません。たとえば、次の XML を考えてみましょう:
エレファント
これは次のように出力しないことをお勧めします:
E
ゾウ
単語の境界が正しくなくなるからです。
これらすべてが自動印刷に問題をもたらします。読み取り可能な XML を印刷する必要がない場合は、DOM を使用して空白文字をテキスト ノードとして適切な場所に挿入できます。
DTD で名前空間を使用するにはどうすればよいですか? DTD でネームスペースを使用するには、次のように、それを使用する要素の ATTLIST 宣言でネームスペースを宣言します。
ネームスペースのタイプは #FIXED である必要があります。属性の名前空間についても同様です。
名前空間と XML スキーマ DTD と XML スキーマを混合することはできません。たとえば、次のような
xmlns:x CDATA #FIXED "x-schema:myschema.xml"
myschema.xml で定義されたスキーマ定義は使用されません。 DTD スキーマと XML スキーマの使用は相互に排他的です。
Visual Basic で XMLDSO を使用するにはどうすればよいですか?
例として次の XML を使用します。
マーク・ハンソン
206 765 4583
ジェーン・スミス
425 808 1111
次のようにして ADO レコードセットにバインドできます。
新しい VB 6.0 プロジェクトを作成します。
Microsoft ActiveX データ オブジェクト 2.1 以降、Microsoft データ アダプター ライブラリ、および Microsoft XML バージョン 2.0 への参照を追加します。
次のコードを使用して、XML データを XML DSO コントロールにロードします。
新しい XMLDSOControl としての Dim dso
IXMLDOMDocument としての Dim doc
doc = dso.XMLDocument を設定します。
doc.Load ("d:test.xml") は、
次のコードを使用して、DataAdapter を使用して DSO を新しいレコードセット オブジェクトにマップします。
新しい DataAdapter としてディム ダ
da.Object = dso を設定します
新しい ADODB.Recordset として薄暗くする
rs.DataSource = da を設定します
データにアクセスする:
MsgBox rs.Fields("name").Value の
結果は文字列「Mark Hanson」になります
。
Java で XML DOM を使用するにはどうすればよいですか?
IE5 バージョンの MSXML.DLL がインストールされている必要があります。 Visual J++ 6.0 では、[プロジェクト] メニューから [COM ラッパーの追加] を選択し、COM オブジェクト リストから [Microsoft XML 1.0] を選択します。これにより、必要な Java ラッパーが「msxml」という新しいパッケージに構築されます。これらの事前に構築された Java ラッパーもダウンロードできます。クラスは次のように使用できます。
com.ms.com.* をインポートします。
msxml.* をインポートします。
パブリッククラス Class1
{
public static void main (String[] args)
{
DOMDocument doc = new DOMDocument();
doc.load(new Variant(" file://d:/samples/ot.xml "));
System.out.println("ロード済み " + doc.getDocumentElement().getNodeName());
}
}
このコード例では、太陽宗教の例から 3.8MB のテスト ファイル「ot.xml」をロードします。 Variant クラスは、Win32 VARIANT 基本型をラップします。
実際にはノードを取得するたびに新しいラッパーを取得するため、ノード上でポインター比較を使用することはできません。したがって、以下のコードは使用しないでください。
IXMLDOMNode root1 = doc.getDocumentElement();
IXMLDOMNode root2 = doc.getDocumentElement();
if (root1 == root2)...
代わりに、次のコードを使用します。
if (ComLib.isEqualUnknown(root1, root2)) ....
.class ラッパーの合計サイズは約 160KB です。ただし、W3C 仕様に完全に準拠するには、IXMLDOM* ラッパーのみを使用する必要があります。次のクラスは古い IE 4.0 XML インターフェイスであり、msxml フォルダーから削除できます。
IXMLAttribute*、
IXMLドキュメント*、XMLドキュメント*
IXML要素*、
IXMLエラー*、
IXMLElementCollection*、
タグXMLEMEM_TYPE*
_xml_error*
これにより、サイズが 147KB に削減されます。次の項目も削除できます。
DOMFreeThreadedDocument
Java アプリケーションの複数のスレッドから XML ドキュメントにアクセスします。
XMLHttpRequest
XML DAV HTTP 拡張機能を使用してサーバーと通信します。
IXTLランタイム
XSL スタイルシート スクリプト オブジェクトを定義します。
XMLDSOコントロール
HTML ページ内の XML データにバインドします。
XMLDOMドキュメントイベント
分析中にコールバックを返します。
これにより、サイズが 116KB に削減されます。さらに小さくするには、DOM 自体に 2 つの層があるという事実を考慮してください。コア層は次のもので構成されます。
DOMドキュメント、IXMLDOMドキュメント
IXMLDOMノード*
IXMLDOMNodeList*
IXMLDOMNamedNodeMap*
IXMLDOMドキュメントフラグメント*
IXMLDOMI実装
IXMLDOMParseError
ユーザーが保持する必要がある DTD 情報:
IXMLDOMDocumentType
IXMLDOMentity
IXMLDOM記法
XML ドキュメント内のすべてのノード タイプは IXMLDOMNodes であり、完全な機能を提供しますが、ノード タイプごとに上位レベルのラッパーが存在します。したがって、DOMDocument ラッパーを変更し、これらの特定の型を IXMLDOMNode を使用するように変更すると、次のインターフェイスをすべて削除できます。
IXMLDOMA属性
IXMLDOMCDATAセクション
IXMLDOMキャラクターデータ
IXMLDOMコメント
IXMLDOM要素
IXMLDOM処理命令
IXMLDOMentityReference
IXMLDOMテキスト
これらを削除すると、サイズが 61KB に減少します。ただし、IXMLDOMElement の場合は、getAttribute メソッドと setAttribute メソッドの両方が便利です。それ以外の場合は、以下を使用する必要があります。
IXMLDOMNode.getAttributes().setNamedItem(...)