XML の使用開始に関するよくある質問 (4)

黄舟
リリース: 2016-12-22 17:39:44
オリジナル
1898 人が閲覧しました

XMLオブジェクトモデルで空白文字をどう扱うか?

XML オブジェクト モデルでは、空白文字を含む TEXT ノードが表示される場合があります。空白文字が切り捨てられると、混乱が生じる可能性があります。例えば以下のXML例: ELEMENT: lastname

TEXT:

ELEMENT : firstname
TEXT:


「person」要素のコンテンツモデルは、名と姓が空白文字のみを含むTEXTノードで囲まれています。 MIXED; #PCDATA キーワードが含まれています。 MIXED コンテンツ モデルは、要素間にテキストが存在できることを指定します。したがって、以下も正しいです:

私の姓は Smith で、私の名は John



結果は、次のようなツリーになります: ELEMENT: person
TEXT: My last name is
ELEMENT : lastname
TEXT: and my first name is
ELEMENT: firstname
TEXT:

単語「is」の前後の空白文字と、単語「and」の前後の空白文字がなければ、文章は理解できません。 。したがって、MIXED コンテンツ モデルの場合、テキストの組み合わせ、空白文字、および要素はすべて関連します。これは、非 MIXED コンテンツ モデルには当てはまりません。

空白文字のみのTEXTノードを非表示にするには、「person」要素宣言から#PCDATAキーワードを削除します:


結果は次のような明確なツリーになります:

処理命令: xml
DocType: person

ELEMENT: person

ELEMENT: lastname
ELEMENT: firstname

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 行に入力され、間にスペースは入りません。これはデフォルトの動作です。

XML ドキュメントを読み取り可能な形式で表示および印刷するには、Internet Explorer 5 でデフォルトの XSL スタイルシートを構築します。たとえば、IE5 がインストールされている場合は、nospace.xml ファイルを調べてみてください。次のツリーがブラウザに表示されるはずです:

-

-


読み取り可能な XML を印刷することは、特にさまざまな種類のコンテンツ モデルを定義する DTD がある場合に非常に興味深いものです。たとえば、混合コンテンツ モデル (#PCDATA) では、コンテンツの意味が変わる可能性があるため、スペースを挿入できません。たとえば、次の XML を考えてみましょう:

Elephant

これは、単語の境界が正しくなくなるため、次のように出力しない方がよいでしょう:


E
elephant

これらすべてが自動印刷に問題をもたらします。読み取り可能な 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 を使用します:

Mark Hanson 206 765 4583

Jane Smith 425 808 1111 次のように ADO レコードセットにバインドできます:

新しい VB 6.0 プロジェクトを作成します。


Microsoft ActiveX データ オブジェクト 2.1 以降、Microsoft データ アダプター ライブラリ、および Microsoft XML バージョン 2.0 への参照を追加します。

次のコードを使用して、XML データを XML DSO コントロールにロードします。


Dim dso As New XMLDSOControl
Dim doc As IXMLDOMDocument
Set doc = dso. :

Dim da As New DataAdapter

Set da.Object = dso

Dim rs As New ADODB.Recordset
Set 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 ラッパーもダウンロードできます。クラスは次のように使用できます:

import com.ms.com.*;

import msxml.*;

public class Class1
{
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());
}
}


コード例では、太陽宗教の例から 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 フォルダーから削除できます:

_xml_error*


これにより、サイズが 147 KB に削減されます。次の項目も削除できます:


DOMFreeThreadedDocument
Java アプリケーションの複数のスレッドから XML ドキュメントにアクセスします。
xmlhttpRequest
XML DAV HTTP 拡張機能を使用してサーバーと通信します。

IXTLRuntime

XSLスタイルシートスクリプトオブジェクトを定義します。

XMLDSOControl

HTML ページ内の XML データにバインドします。

XMLDOMDocumentEvents

分析プロセス中にコールバックを返します。



これにより、サイズが 116KB に削減されます。小さくするために、DOM 自体には 2 つの層があるという事実を考慮してください。コア層は、


DOMDocument, IXMLDOMDocument
IXMLDOMNode*
IXMLDOMNodeList*
IXMLDOMNamedNodeMap*

IXMLDOMDocumentFragment*

IXMLDO MImplementation

IXMLDOMParseError

そしてユーザーDTD 情報を保持する必要がある場合があります:


IXMLDOMDocumentType
IXMLDOMEntity
IXMLDOMNotation

XML ドキュメント内のすべてのノード タイプは IXMLDOMNodes であり、完全な機能を提供しますが、ノード タイプごとに上位レベルのラッパーが存在します。したがって、DOMDocument ラッパーを変更し、これらの特定のタイプを IXMLDOMNode を使用するように変更すると、次のインターフェイスをすべて削除できます: IXMLDOMAttribute IXMLDOMCDATASection IXMLDOMCharacterData IXMLDOMComment IXMLDOMElement Processingstructing

IXMLDOMentityReference
IXMLDOMText


これらを削除すると、サイズが小さくなります。 61KB。ただし、IXMLDOMElement の場合は、getAttribute メソッドと setAttribute メソッドの両方が便利です。それ以外の場合は、次を使用する必要があります:

IXMLDOMNode.getAttributes().setNamedItem(...)


上記は、XML を始めるための FAQ (4) の内容です。さらに関連する内容については、注意してください。 PHP 中国語 Web サイト (www.php.cn) !




関連ラベル:
xml
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート