1

親タグに対応するオブジェクトではなく、現在のオブジェクトでset メソッドを呼び出しているため、Apache Digester に問題があります。結果は NoSuchMethodException です。

Note: I'm reusing the Digester object due to performance problems, but I'm calling clear() method before each parse.

これが私のコードです:( Message オブジェクトの代わりに Header オブジェクトでsetHeaderメソッドを呼び出しています)。

XML:

<message>
    <header id_message="2014871" date="07/08/2014 21:56:41" />
    <body>
        ...
    </body>
</message>

ダイジェスターを作成するコード:

digesterSOBB = new Digester();
digesterSOBB.setValidating(true);
digesterSOBB.setSchema(XMLParser.class.getResource(dtdUrlSOBB).getFile());
digesterSOBB.register("message", XMLParser.class.getResource(dtdUrlSOBB));
digesterSOBB.setErrorHandler(new XMLDtdValidationErrorHandler());

//Message
digesterSOBB.addObjectCreate("message", "com.company.utils.xmlparser.beans.sosc.Message");
digesterSOBB.addSetProperties("message");

//Header-I
digesterSOBB.addObjectCreate("message/header", "com.company.utils.xmlparser.beans.sosc.Header"); 
digesterSOBB.addSetProperties("message/header");
digesterSOBB.addSetNext("message/header", "setHeader", "com.company.utils.xmlparser.beans.sosc.Header");

正常に動作していますが、いくつかの xml を処理するときに、Header オブジェクトで setHeader メソッドを呼び出そうとします。

[8/7/14 5:22:00:322 CEST] 00000061 Digester      E org.apache.commons.logging.impl.Jdk14Logger error End event threw exception
java.lang.NoSuchMethodException: No such accessible method: setHeader() on object: com.company.utils.xmlparser.Header
at org.apache.commons.beanutils.MethodUtils.invokeMethod(MethodUtils.java:278)
at org.apache.commons.digester.SetNextRule.end(SetNextRule.java:217)
at org.apache.commons.digester.Rule.end(Rule.java:253)
at org.apache.commons.digester.Digester.endElement(Digester.java:1332)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)
...

javadoc ( http://commons.apache.org/proper/commons-digester/commons-digester-2.0/docs/api/ ) を確認しましたが、コードは問題ないようです (2 番目のパラメーターはメソッド名です)親要素を呼び出す):

public void addSetNext(String pattern,
                       String methodName,
                       String paramType)
Add a "set next" rule for the specified parameters.
Parameters:
pattern - Element matching pattern
methodName - Method name to call on the parent element
paramType - Java class name of the expected parameter type (if you wish to use a primitive type, specify the corresonding Java wrapper class instead, such as java.lang.Boolean for a boolean parameter)
4

1 に答える 1

1

私はこのライブラリを使用していませんが、マニュアルを見てみると、それはスタックベースです - おそらく子 (ヘッダー) の下にある親 (メッセージ) を参照するときに、新しいオブジェクトがスタックの上にあるという順序の問題がありますか? ?

FAQ には、これに関する情報が少しあります: http://wiki.apache.org/commons/Digester/FAQ

参照 -> SetNextRule の前に CallMethodRule を起動するにはどうすればよいですか? 推奨されるシーケンスの例は次のとおりです。

digester.addObjectCreate("parent", Parent.class);
digester.addObjectCreate("parent/child", Child.class);
digester.addSetNext("parent/child", "addChild");
digester.addCallMethod("parent/child", "setName", 1);
digester.addCallParam("parent/child/name", 0);

お役に立てれば。

于 2014-09-01T14:12:49.847 に答える