2011-05-13 9 views
0

私はこのように、定義された属性のないXMLコンテンツを持っている:必須のXML属性を検出するにはどうすればよいですか?

<rootElement> 
    <subElement1/> 
</rootElement> 

私はこのXMLのためのXMLスキーマ(XSD)で定義された必要な属性を持つこのXMLコンテンツを移入します。

たとえば、XSDによると、subElement1には属性 'id'が必要です。

これを検出してその属性をXMLに追加する最良の方法(Java処理用)は何ですか? 必要な属性を追加し、適切な値を設定する必要があります。例えばその結果

私たちは、次のXMLを持っている必要があります上:

<rootElement> 
    <subElement1 id="some-value"/> 
</rootElement> 

答えて

0

、XMLツリーをトラバースするDOM parser.Hasメソッドを使用してアクセス、挿入、および削除ノード

+0

私はそれを知っています。しかし、どのように私は必要な属性を見つけるのですか?私はSAXパーサを見て、それをやる方法を見つけませんでした。 – Nawa

+1

このhttp://tutorials.jenkov.com/java-xml/dom-schema-validation.htmlを確認してください。検証を有効にし、エラーハンドラを使用します... – Cris

+0

はい、私はちょうど場合のこの考えを持っていた – Nawa

3

IだろうJAXBを使用することをお勧めします。インターネットでチュートリアルを検索します。 JAXBをさらに進めるため

ステップ、

  1. 生成されたJavaクラス(豆)に非整列化に
  2. あなたのXMLスキーマをを提供することにより、JAXBを使用してJavaファイルを生成します。ここでは検証を行わず、検証ハンドラを設定しないでください。
  3. これらのクラスに適切な値を設定します。 required要素は、注釈ルックアップを使用して見つけることができます。要素のJAXB注釈は、何かのように見えます。@XmlElement(name = "ElementName", required = true)。属性アノテーションはこれに似たものになります。@XmlAttribute(required = true)
  4. BeanをXMLにマーシャリングし直します。マーシャリング中にValidationHandlerを使用してBeanを検証できます。以下のサンプルコードスニペット、XMLスキーマ定義で

    marshller = JAXBContext.newInstance(pkgOrClassName).createUnmarshaller(); 
    marshller.setSchema(getSchema(xsd)); // skip this line for unmarshaller 
    marshller.setEventHandler(new ValidationHandler()); // skip this line for unmarshaller 
    
+0

これは静的なxmlとxsdのための良い方法かもしれません。しかし、私は自分のコードでその属性を手配しなければなりません。 – Nawa

+0

@Nawa:あなたのxsd /スキーマは、おそらく修正されるでしょう。しかし、はい、XMLは、そのスキーマを遵守している任意のファイルにすることができます。しかしこれはそれのために働くでしょう、私は信じています。それ以外の場合は、正確な問題について詳しく説明してください。 –

+0

初期XMLには一般に属性が含まれておらず、タグのみが存在します。必要な属性が不足しているためスキーマに対して無効になります。私はそれを有効にするために、最初のxmlに必要なすべての属性を埋めたいと思います。 – Nawa

3

、すなわちXSDファイルであり、属性は、デフォルトではオプションです。必要な属性を作成するには、ユーザーが定義する必要があります。

<xs:attribute name="surname" type="xs:string" use="required"/> 

をあなたはW3 Schoolsに、XMLおよびXMLスキーマ定義、すなわち、XSDに非常に良い導入を見つけるでしょう。

Javaでは、XMLスキーマを定義するのと同じことがJAXB、つまりJava SEに組み込まれているXMLバインディング用のJava APIを使用しています。ここでは、たとえば次のように定義します。

@XmlRootElement 
public class Person { public @XmlAttribute(required=true) String surname; } 

これはあなたの質問を明確にすることができます。

+0

私はXSDで必要な属性を定義する方法を知っていますが、これは私の仕事ではありません。必要なすべての属性をXMLに挿入したいだけです。 – Nawa

+0

XMLエンティティを表すJAXBクラスを取得したら、Reflectionを使用して注釈に必要な属性を照会することができます。 –

0

私はCrisと同じアイデアを持っていましたが、このバリデーターではエラーが発生した時点に関する情報はありません。 自分のバリデータを作成したり拡張したりしなければならないと思います。

関連する問題