1

XML スキーマ定義と JAXB を使用して、適切な@XmlElementまたは@XmlRootElement注釈を付けた Java クラスを生成します。

スキーマには深い入れ子が含まれているため (私の選択ではありません)、jxpathXPath を使用して深く埋め込まれたクラスにアクセスしたいと思います (面倒な.getThat()andのデイジー チェーンではなくthat != null)。

問題は、一部の XML 要素名にダッシュが含まれていることです (例: foo-bar. を使用して要素にアクセスしようとするとorg.apache.jxpath、XPath を書き直してfooBar、実際の Java オブジェクトの名前のようにキャメル ケース ( ) にする必要があります。jxpath(キャメルケースの Bean 名の代わりに) XML 要素名に対応する XPath を使用して要素を見つけるように指示する方法はありますか?

この質問に関連していると思いますが、私の場合、xjcができる限り、自動生成されたクラスでどのようなトリックや装飾が使用されているかは実際にはわかりません。

この問題を説明する簡単な例を次に示します。

まず、小さな XSD ファイル:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="record">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="foo-bar" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

コンパイルして...

xjc -p org.pd.jx example.xsd 

以下は、xjc によって生成されたRecord.javaクラスです (コメントを除く)。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"fooBar"})
@XmlRootElement(name = "record")
public class Record {
    @XmlElement(name = "foo-bar", required = true)
    protected String fooBar;
    public String getFooBar() {return fooBar;}
    public void setFooBar(String value) {this.fooBar = value;}
}

jxpath次に、 (実際には、深くネストされた多くのクラスを処理する必要があります)を介してデータにアクセスしようとすると、正しい XPath ( "foo-bar") が機能しないことがわかりますが、キャメル ケースのバージョンは機能します。

    Record record = new Record();
    record.setFooBar("hello world");

    JXPathContext context = JXPathContext.newContext(record);
    context.setLenient(true);
    String a = (String)context.getValue("foo-bar", String.class);  // is null
    String b = (String)context.getValue("fooBar", String.class);  // "hello world"
4

1 に答える 1

1

JXPath は、対応する XML 要素ではなく、オブジェクトのプロパティで動作すると思います。JXPath が JAXB メタデータを解析するとは思わないので、マッピングした XML ノードを認識できません。あなたが見ているのは、期待される動作のようです。

于 2015-03-15T12:53:21.003 に答える