Java&XMLの初心者です。
用語の使い方など間違っているかもしれませんが、
よろしくお願いします。

XMLパーサーにxercesを利用しています。

以下のようなXMLをがあったときに、
<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "a.dtd">
<a>
<b>1</b>
<b>1</b>
</a>

以下のコードを実行すると、
 SAXParserFactory f = SAXParserFactory.newInstance();
 f.setValidating(true);
 SAXParser p = f.newSAXParser();
 p.parse((InputSource)xml, handler);

カレントディレクトリにあるa.dtdとの妥当性をチェックしますが、
これをファイルは無視し、指定した文字列とチェックをさせるなどと
いうことは可能でしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

> 「a.dtdというファイルからではなく、文字列としてDTDの定義を


>  保持しておき、文字列とXMLデータとの妥当性をチェックする」

質問は、ばっちり理解しましたが、回答できるだけの力量がありません (^^;
「何か知っていることがあれば」とのことなので、できる範囲で。

参考URLのひとつめ apache プロジェクトのマニュアルから SAXParser のページを見ると
AbstractSAXParser クラスの startDTD() というメソッドがオーバーライドされて
います。

こいつには XMLLocator というのを受け取ります(参考URLのふたつめ)。
それを適切に置き換えれば、何か出来そうな気が…

後、DTDGrammar というクラスもちょっと気になります。


# と言いつつ、マニュアルをあさってみましたが、いまいち有効な手段が見当たりません m(_ _)m

参考URL:http://xml.apache.org/xerces2-j/javadocs/xerces2 …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

いろいろ調べましたが、
「a.dtdというファイルからではなく、文字列としてDTDの定義を
 保持しておき、文字列とXMLデータとの妥当性をチェックする」
という方法は無理なような気がしてきました。

読み込んだXMLファイルの<!DOCTYPE>を保持しているDTDに変えて、
parseすれば妥当性のチェックはできると思うので、そうします。
ありがとうございました。

お礼日時:2001/12/27 14:45

SAX は使ったことは無いんですが、マニュアルから分かる範囲で。



> カレントディレクトリにあるa.dtdとの妥当性をチェックしますが、
> これをファイルは無視し、

これは、SAXParseFactory に対して setValidating(true) をしなければ
良いんですよね。念の為、ということであれば setValidating(false) と
しておけば良さそう。

> 指定した文字列とチェックをさせる

については、それぞれの Handler でチェック込みの処理をすれば良いだけ
のことです。

この回答への補足

回答ありがとうございます。

私の質問の仕方が悪かった&自分の理解が不十分でした。
すみません。m(__)m

補足します。

Javaで以下の処理をさせたいと考えています。
「a.dtdというファイルからではなく、文字列としてDTDの定義を
 保持しておき、文字列とXMLデータとの妥当性をチェックする」
parseする必要はなく、あくまでも"妥当性のチェック"がやりたいのです。

もし、何か知っていることがあれば回答をお願いします。

補足日時:2001/12/26 17:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q

の使い方

xhtml+cssをやり始めです。

実は、<br />と<p></p>の使い方についてわかんなくて教えてくださーい。

普通のhtmlでは改行したいときは、<br />を入れまくっていましたが、xhtmlは<br/>ではなく改行は<p></p>でといわれました。

<p>あいうえお</p>
<p>かきくけこ</p>

といれると改行にはなりますが、1行あけたい場合はどうしますか?

<p>あいうえお</p>
<p></p>
<p>かきくけこ</p>

としても1行あきませんよね?
こういう場合は

<p>あいうえお</p>
<br />
<p>かきくけこ</p>

でいいのですかね???

単純な質問ですみません。

Aベストアンサー

基本的に、<p>タグで段落を作るときに、勝手に一行開けてくれると考えていいかと思います。
そして、<br>は行をあけない普通の改行ということになります。

つまり、一行あけるときは
<p>あいうえお</p>
<p>かきくけこ</p>

行をあけないときは
<p>あいうえお<br />
かきくけこ</p>
となります。

*余談ながら、xhtmlでは<body>の直下に普通のテキストを書くことができませんので、文章を書くときはそれを<p>で囲ってやることが必要となります。

QXSLTを使用したXML->XML変換で...

XSLTを使用したXMLからXMLへの変換で、やり方が分からないのでどなたかお教え願います。

以下にXMLを記述します。

----[入力側]-----
<INPUT>
<IN1>
<old>100</old>
<new>100</new>
</IN1>
<IN2>
<IN21>
<old>200</old>
<new>200</new>
</IN21>
<IN22>
<old>300</old>
<new>300</new>
</IN22>
</IN2>
</INPUT>

----[出力側]-----
<OUTPUT>
<OUT1>
<OUT11>
<old>100</old>
<new>100</new>
</OUT11>
<OUT12>
<OUT121>
<old>200</old>
<new>200</new>
</OUT121>
<OUT122>
<old>300</old>
<new>300</new>
</OUT122>
</OUT12>
</OUT1>
</OUTPUT>


【質問内容】
 集団項目でないタグ(入力側のIN1およびIN2)を集団項目として出力したい

XSLTを使用したXMLからXMLへの変換で、やり方が分からないのでどなたかお教え願います。

以下にXMLを記述します。

----[入力側]-----
<INPUT>
<IN1>
<old>100</old>
<new>100</new>
</IN1>
<IN2>
<IN21>
<old>200</old>
<new>200</new>
</IN21>
<IN22>
<old>300</old>
<new>300</new>
</IN22>
</IN2>
</INPUT>

----[出力側]-----
<OUTPUT>
<OUT1>
<OUT11>
<old>100</old>
<new>100</new>
</OUT11>...続きを読む

Aベストアンサー

> 入力側のIN1,IN2が複数回繰り返された場合、
> 出力側もOUT1が複数回繰り返されるって感じです。

IN1とIN2が必ず1対1に対応するという条件でいいなら(複数の組が存在しても可)これでいけるでしょう。



IN1およびIN2以下の構造はオリジナルのまま出力されます。

<xsl:template match="INPUT">
 <OUTPUT>
  <xsl:apply-templates />
 </OUTPUT>
</xsl:template>
<xsl:template match="IN1">
 <xsl:text disable-output-escaping="yes">&lt;OUT&gt;</xsl:text>
  <xsl:copy-of select="." />
</xsl:template>
<xsl:template match="IN2">
 <xsl:copy-of select="." />
 <xsl:text disable-output-escaping="yes">&lt;/OUT&gt;</xsl:text>
</xsl:template>

> 入力側のIN1,IN2が複数回繰り返された場合、
> 出力側もOUT1が複数回繰り返されるって感じです。

IN1とIN2が必ず1対1に対応するという条件でいいなら(複数の組が存在しても可)これでいけるでしょう。



IN1およびIN2以下の構造はオリジナルのまま出力されます。

<xsl:template match="INPUT">
 <OUTPUT>
  <xsl:apply-templates />
 </OUTPUT>
</xsl:template>
<xsl:template match="IN1">
 <xsl:text disable-output-escaping="yes">&lt;OUT&gt;</xsl:text>
  <xsl:copy-of sele...続きを読む

QDTDとXML Schemaでのデフォルト値の指定について

以下のような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に関わらず、
デフォルト値が指定された属性を含めることはできないのでしょうか?

以下のような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で...続きを読む

Aベストアンサー

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 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の中ならば必須ではない(もしかしたらやってくれる場合もあるかもしれないのですが)、とい...続きを読む

Q外部サブセットのDTDファイルが作れません

初心者です。

本を読みながらXMLの勉強をはじめました。
表題の、外部サブセットのDTDファイルを作ろうと、拡張子を"dtd"に変えたところ、DTDファイルとして認識していないようです。
(WINDOWマークのアイコンに変わり、開くとアプリケーションを聞かれてしまいます。)

本にはそのようにするとだけしか記載されておらず、どうしていいのかわかりません。

なにかPCの方に入れなければならないものがあるのでしょうか?
パソコンはNECのVALUSTAR NXで2年ぐらい前のもの、OSはWINDOWS98、ブラウザIE5.5です。


本当にずぶの素人で何もわからないままはじめたので、質問がこれで適切かどうかもわかりませんが、どなたかお教えください。
よろしくお願いいたします。

Aベストアンサー

困り度3なのに誰も答えていないようなので。

拡張子"dtd"はアプリケーションに関連付けされていないのが普通だと思いますので、アイコンがWindowsマークであっても気にする必要はありません。メモ帳などのエディタで編集するだけでOKです。

毎回「アプリケーションから開く」をするのが面倒ならば、お使いのエディタに関連付けをしておけばよいと思います。

どのような本なのかは存じませんが、本のサンプルに書かれている通りにファイルを作成および編集し、以下のようにXMLファイルに記述すれば大丈夫だと思います。(文書要素型がabcでDTDファイルへのパスがhoge.dtdである場合)

<!DOCTYPE abc SYSTEM "doctype_test.dtd">

この辺は読まれている本にも書かれているとは思うのですが、一応。

Q妥当なXML(Valid XML)のチェックについて

妥当な文書にするためにチェックを行っているのですが
http://validator.w3.org/
ここれでやるとThis page is not Valid (no Doctype found)!といわれ

omitted tag minimization parameter can be omitted only if OMITTAG NO is specified.

などとエラーがでてしまいます。

しかし、http://www.stg.brown.edu/service/xmlvalid/でやるときちんとValidになります。


先生からはhttp://validator.w3.org/でチェックをするときいたのですがどうしてもエラーがでるので
やはりhttp://validator.w3.org/はXHTMLだけでXMLのチェックというものはできないのでしょうか?
XMLのValidかどうかのチェックはhttp://www.stg.brown.edu/service/xmlvalid/でやればいいのでしょうか?

妥当な文書にするためにチェックを行っているのですが
http://validator.w3.org/
ここれでやるとThis page is not Valid (no Doctype found)!といわれ

omitted tag minimization parameter can be omitted only if OMITTAG NO is specified.

などとエラーがでてしまいます。

しかし、http://www.stg.brown.edu/service/xmlvalid/でやるときちんとValidになります。


先生からはhttp://validator.w3.org/でチェックをするときいたのですがどうしてもエラーがでるので
やはりhttp://validator.w3.or...続きを読む

Aベストアンサー

>ファイルをアップロードしてチェックした場合だとSorry! This document can not be checked.

再現した(笑)
[原因]
どうやらファイルアップロードはXML宣言にShift_JISって書いてあっても
us-ascii扱いになってしまうようだ。
で、そのために「ごめんね、マルチバイトの文字は読めないの」って謝られるの。
[回避策]
Extended File Upload Interfaceって奴にアクセスすると
色々指定できる。チェックする時にアップロードして
Encoding:の欄を(detect automatically) [自動的に検出する→us-asciiと検出される]からshift_jisを明示してあげると検証が行われる。

俺は大抵BOM付UTF-8で文書を作ってきちんと自動認識されていたと思う。(BOMなしだとus-asciiとかその他のエンコードだと思われかねないから)
=======================
>This page is not Valid (no Doctype found)!

[原因]
テキスト入力だと「DOCTYPE宣言書け」って書いてあるくせに、
内部サブセットだとDOCTYPE宣言だと認識できず
要素型宣言等をタグだと思い込みやがるらしい。
(当然終了タグに該当するものがないので「きちんと閉じやがれ」って言ってる)
[回避策]
なし。多分仕様。

>ファイルをアップロードしてチェックした場合だとSorry! This document can not be checked.

再現した(笑)
[原因]
どうやらファイルアップロードはXML宣言にShift_JISって書いてあっても
us-ascii扱いになってしまうようだ。
で、そのために「ごめんね、マルチバイトの文字は読めないの」って謝られるの。
[回避策]
Extended File Upload Interfaceって奴にアクセスすると
色々指定できる。チェックする時にアップロードして
Encoding:の欄を(detect automatically) [自動的に検出する→us-asciiと検出...続きを読む


おすすめ情報