以下のようなXMLをパーズするプログラムがあります。
------------------------------------------------------------------
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(true);
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
Document doc = documentBuilder.parse(new InputSourc("a.xml"));
------------------------------------------------------------------
a.xmlに以下のようなXMLの構造をDTDで指定した場合のxmlをパーズさせると、
<!DOCTYPE a [
<!ELEMENT a (#PCDATA)>
<!ATTLIST a a1 CDATA "abc">
]>
<a/>
上記のプログラム3行目のvalidationの設定がtrue、falseに関わらす、
<a a1="abc"/>
というような形式のドキュメントオブジェクトが返ってきます。
ですが、以下のようにXMLの構造をXML Schemaで定義した場合、
a.xml
<a xsi:noNamespaceSchemaLocation="b.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
b.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="a">
<xsd:complexType>
<xsd:attribute name="a1" type="xsd:string" default="abc"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
返ってくるドキュメントオブジェクトのa要素には、validationがtrueの場合はa1属性が含まれる、falseの場合は含まれません。
これは正しい動作なのでしょうか?
また、XML Schemaの場合もvalidationがtrue、falseに関わらず、
デフォルト値が指定された属性を含めることはできないのでしょうか?
No.1
- 回答日時:
XML1.0の規格では「文書内で属性が指定されていないときにXMLプロセッサがどう処理しなければならないかまたは処理するほうがいいかの情報も与える。
」となっているようなのでDTDに記述された内容は妥当性の検証をおこなうかどうかにかかわらずdefault値が摘要されるようです。(質問では内部DTDで記述されていますが外部DTDであったばあい、妥当性の検証を行わなかったときの処理がどうなっているかは覚えていません)一方、XML Schemaでは妥当性の検証を行う際に参照されるので検証しない場合には適用されないとなっているようです。
自信がないのでURLを紹介しておきます
XML1.0
英語:
http://www.w3.org/TR/REC-xml
日本語:
http://www.fxis.co.jp/DMS/sgml/xml/rec-xml.html
XML Schema Part 0:
英語:
http://www.w3.org/TR/xmlschema-0/
日本語(ただし草案):
http://www.trl.ibm.com/projects/xml/xmlschema-0j …
返事が遅くなって申し訳ありません。
XML Schemaがそういう仕様になっているのであれば、しょうがないですね。
今自分の作っているものがそういう動作をするのはXML Schemaが
そうだから・・・と上司への言い訳ができました。(~O~)
ありがとうございました。
No.2ベストアンサー
- 回答日時:
XML 1.0では、validationしないプロセッサのDTDに対する動作に関して、以下のような記述があります。
(5.1 Validating and Non-Validating Processorsより)Non-validating processors are required to check only the document entity, including the entire internal DTD subset, for well-formedness.
つまり、internal DTD subsetの中ならば、validationしなくてもデフォルト値などは使わなければならず、externalの中ならば必須ではない(もしかしたらやってくれる場合もあるかもしれないのですが)、ということになります。
一方、XML Schemaの具体的な記述は見つかりませんでしたが(なにしろ量が多いので)、デフォルト値のような情報追加について、以下のような記述があります。
(2.3 Constraints and Validation Rulesの、Schema Information Set Contributionの定義より)
Augmentations to post-schema-validation infosets expressed by schema components, which follow as a consequence of validation and/or assessment.
これを読む限り、validationを行なわないとデフォルト値は追加されないように読めます。
XML Schemaを使いつつ、validationしない時にデフォルト値だけは埋めたい場合には、デフォルト値を与える宣言だけを記述したinternal DTD subsetと組み合わせるしかないかもしれません。冗長になりますが。
※載せた英文は、以下の2つのURLから引用しました。
http://www.w3.org/TR/2000/REC-xml-20001006
XML 1.0(Second Edition)
http://www.w3.org/TR/2001/REC-xmlschema-1-20010502
XML Schema Part 1: Structures
返事が遅くなって申し訳ありません。
XML Schemaについて詳しい説明があるのは英語のものばかりなので、
なかなか読む気になりません。。。
これからは英語の文書をよく読んで調べてから質問したいと思います。
ありがとうございました。
No.3
- 回答日時:
#2の方の揚げ足を取るわけではありませんがXML1.0について引用された記述はentityについての記述であって属性の宣言についての記述ではないと思います。
まぁ、実体参照(entity)については処理しなくちゃいけないということで間違ってはいないと思いますが。
No.4
- 回答日時:
元の質問とあまり関係なくなっちゃいますが。
私の理解では、あの引用部分は、entityの解決のために読み込まないという意味ではなく、external DTD subsetを読み込むことが必須でないことを表していると思って引用しました。たぶん段落の前後でentityが盛んに出てくるからだと思いますが、external DTD subsetもentityなので。
external DTD subsetが読み込まれることが必須でないから、その結果external DTD subsetに記述されたデフォルト値は認識されないかもしれない、という意味だったのですが、分かりにくかったでしょうか。
2.9 Standalone Document Declarationのところを引用しても良かったのですが、説明が長くなりそうだったので、すみません。
ちなみに、XML SchemaをDTDと組み合わせることができることに触れたのは、DTDと組み合わせた場合にXML Schemaがexternal DTD subsetみたいに扱われるとみなせば、一応整合性がとれていると言えるかも、という意味でもあります。
参考URL:http://www.w3.org/TR/2000/REC-xml-20001006
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- HTML・CSS 疑似要素で背景画像に指定したSVG画像の色変更 2 2023/01/30 22:45
- その他(プログラミング・Web制作) Excel の判定式で正しく判定されない場合があります。 2 2022/05/31 14:43
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- アプリ Android studio 初心者 Hello Android!しか表示されない 1 2023/08/01 08:47
- AJAX 自作の地図をグーグルマップのようにしたい 3 2022/11/15 11:53
- HTML・CSS ホームページのHTMLサイトマップを自動作成する方法を探しています。 1 2023/05/17 21:36
- Visual Basic(VBA) エクセルで、1つのセルで上書き足し算して セルの範囲を指定できますか? パソコン初心者です。 お時間 3 2023/07/05 06:13
- WordPress(ワードプレス) ワードプレスにて .xmlファイルの使い方をご存知の方、よろしくお願いいたします。 2 2022/09/30 00:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBでXMLファイルを作ると xmlns...
-
u_shortなどの省略した宣言につ...
-
XSLで、XMLの空タグを制御したい。
-
CPUの考え方を教えてください ...
-
東芝のDynabookなのですがアン...
-
XMLで要素が記述された順番に意...
-
ノードとは
-
SNMP リンクダウンとノードダ...
-
UTF-8でエンコーディングとはど...
-
2分探索木の高さを求めるプロ...
-
XMLのタグ名に予約語は禁止?
-
XMLへDOMでタグの追加
-
XML::LibXMLのfindnodes()で、...
-
ルート要素ノードが2個ある場合?
-
excelにてweb関数を使い、webデ...
-
ツリービューを閉じさせたくない。
-
C#で使用中のファイルに別のフ...
-
Excel(2007以降)をxml形式に変...
-
for-eachが上手くいきません
-
XSL中の改行、タブを無効にした...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
u_shortなどの省略した宣言につ...
-
VBでXMLファイルを作ると xmlns...
-
縁切りするとき
-
XML Schemaの妥当性のチェック
-
DTDファイルをクラスパスから読...
-
このエラー、何とかなりません...
-
oo4o OpenDatabaseの定数について
-
東芝のDynabookなのですがアン...
-
CPUの考え方を教えてください ...
-
XMLで要素が記述された順番に意...
-
昔Winnyってありましたけど、あ...
-
バッチファイルでテキストファ...
-
XML、XSLTの適応エラー(IEから...
-
UTF-8でエンコーディングとはど...
-
SNMP リンクダウンとノードダ...
-
ルート要素ノードが2個ある場合?
-
XMLファイル内のデータ(値)を変...
-
xmlファイルが上手にHTMLに変換...
-
同じタグ名の項目取得
-
ExcelVBAで書き出した文字が化ける
おすすめ情報