AbstractJaxbクラスで子孫のタグをすべて取得したい

21 views
Skip to first unread message

ひろ

unread,
Apr 8, 2014, 1:41:11 AM4/8/14
to mixe...@googlegroups.com
お世話になります。

AbstractJaxbクラスで子孫のタグをすべて取得したいのですが可能でしょうか?
現在の提供されているgetDescendantsメソッドはクラス名の指定が必要なのですが、クラス名を指定せずにすべてのタグを取得したいです。

よろしくお願いします。

ひろ

unread,
Apr 8, 2014, 1:42:16 AM4/8/14
to mixe...@googlegroups.com
使用しているバージョンは1.2.22です。

2014年4月8日火曜日 14時41分11秒 UTC+9 ひろ:

nabedge

unread,
Apr 8, 2014, 8:29:49 AM4/8/14
to mixe...@googlegroups.com
渡辺です。
現状ではそれはちょっと難しいです。
--------
nab...@gmail.com


2014年4月8日 14:41 ひろ <hiro...@freegw.net>:
> --
> このメールは Google グループのグループ「mixer2-ja」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには mixer2-ja+...@googlegroups.com
> にメールを送信してください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

ひろ

unread,
Apr 9, 2014, 12:25:00 AM4/9/14
to mixe...@googlegroups.com
ひろです。
ご回答ありがとうございます。

サポートは難しいですか。。。
残念です。

実は次のようなことをしたいと思っていてその方法を探しているのでこちらの解決方法があるならご教示ください。


やりたいのは、ひな形を用意してソースを置き換えることです。

パターン1:タグの中身をそっくり入れ替える
【ひな形】
<head>
yyy
...
</head>

【ソース】
<head>
xxx
...
</head>


【出力するソース】
<head>
yyy
...
</head>


パターン2:特定の位置に挿入する
【ひな形】
<div>
  <div id="here"></div>
</div>

【ソース】
<div>
  aaaaaaaaa
  <div id="here">
  xxx
  yyy
  </div>
  bbbbbbbb
</div>


【出力するソース】
<div>
  aaaaaaaaa
  xxx
  yyy
  bbbbbbbb
</div>



2014年4月8日火曜日 21時29分49秒 UTC+9 nabedge:

nabedge

unread,
Apr 9, 2014, 9:55:26 AM4/9/14
to mixe...@googlegroups.com
渡辺です。

> パターン1:タグの中身をそっくり入れ替える
> 【ひな形】
> <head>
> yyy
> ...
> </head>
>
> 【ソース】
> <head>
> xxx
> ...
> </head>
>
>
> 【出力するソース】
> <head>
> yyy
> ...
> </head>

「タグの中身を入れ替える」のと「タグそれ自体を入れ替える」のと
それぞれやり方がありそうですね。

Html hinagata = m2e.loadHtmlTemplate("hinagata.html");
Html source = m2e.loadHtmlTemplate("source.html");
// headタグ自体をそっくりそのままひな形のやつに入れ替える
source.setHead(
hinagata.getHead().copyNoException(Head.class)
);
// headタグの中身だけをひな形のheadの中身と入れ替える
Head hinaHead = hinagata.getHead().copyNoException(Head.class)
source.getHead().unsetContent();
source.getHead().getContent().addAll(hinaHead.getContent());

hinagataは使い回す可能性があるので、
処理中に中身をうっかり書き換えてしまわないように、
適宜copy()あるいはcopyNoException()を使う方が安全です。


--------
nab...@gmail.com

nabedge

unread,
Apr 9, 2014, 9:59:49 AM4/9/14
to mixe...@googlegroups.com
渡辺です。

> パターン2:特定の位置に挿入する
> 【ひな形】
> <div>
> <div id="here"></div>
> </div>
>
> 【ソース】
> <div>
> aaaaaaaaa
> <div id="here">
> xxx
> yyy
> </div>
> bbbbbbbb
> </div>
>
>
> 【出力するソース】
> <div>
> aaaaaaaaa
> xxx
> yyy
> bbbbbbbb
> </div>

これはいまいち意味がつかみづらかったのですが。
ひな形とソースのマージのルールというか仕様が・・・?
たとえば<div id="here">の中はstringのみでタグは無いという前提でよいのでしょうか?



--------
nab...@gmail.com

ひろ

unread,
Apr 10, 2014, 1:19:47 AM4/10/14
to mixe...@googlegroups.com
ひろです。
すみません、例の内容が間違っていました。
<div id="here"></div>の部分をソースの<div id="here"></div>中に書いてあるコードと置き換えたいと思っているので、
【ひな形】
<div>
  aaaaaaaaa
  <div id="here"></div>
  bbbbbbbb
</div>

【ソース】
<div>
  ccccccccccc
  <div id="here">
  xxx
  <a href=hoge>hoge</a>
  yyy
   :
  </div>
  dddddddd
</div>

【出力するソース】
<div>
  aaaaaaaaa
  xxx
  <a href=hoge>hoge</a>
  yyy
   :
  bbbbbbbb
</div>

です。
なので、DIVの中に書けるものであればなんでも書かれます。

どういう状況を想定しているかというと、プロジェクトの初期段階で大まかなレイアウトを決めてソースのHTMLを作成していき、あとでひな形にソースの一部だけを埋め込むという状態を想定しています。
ひな形が決まるまで、ソースのHTMLもそこそこ見栄えを近くしておきたいので関係ない部分を適当な文言(ccc,dddの部分)で埋めておきますが、ひな形を使って表示する時は適当な文言はひな形側を使いたいという状態です。
ソースHTMLの
  <div id="here">
  xxx
  <a href=hoge>hoge</a>
  yyy
   :
  </div>
がソースHTMLでは必用でそれ以外はひな形に書かれたコードを出したいのです。


<div id="here"></div>は本当は

【ひな形】
<div>
  aaaaaaaaa
  <!-- #replace(1) --> 
  bbbbbbbb
</div>

【ソース】
<div>
  ccccccccccc
  <!-- #replace(1) from --> 
  xxx
  <a href=hoge>hoge</a>
  yyy
   :
<!-- #replace(1)  to --> 
  dddddddd
</div>

 
 のようにコメントで書けるとタグの階層が変わらなくて嬉しいのですが、そこまでやる方法が分からなかったのでdivで囲みました。
<div id="here">というタグは最終形には不要なので出力時には取ってしまいたいのです。

それで次のようなコードを書いてみました。(説明用の抜粋です)

    AbstractJaxb master = masterHtml.getById(id, tagType); // masterにソースHTMLの<div id="here">を入れておく

        :

    Div tag = (Div) master;
    List<Object> m = tag.getContent();
    for (Object content : m) {
        AbstractJaxb a = cast(content); // castはObjectからAbstractJaxbに変換する自作メソッド
        if (a == null) {
            continue;  // contentがStringだとinsertBeforeIdができない ---(A)
        }
        sourceHtml.getBody().insertBeforeId(id, a);

    }
    sourceHtml.removeById(id); // <div id="here">を削除する

これで大体期待通りの結果になるのですが (A)の部分が困っています。
getContentで取り出したObjectがStringだとAbstractJaxbの派生クラスに変換できないのでinsertBeforeIdができません。
これができればやりたいことが実現できるのですが、String型をinsertBeforeIdに入れるにはどうしたら良いのでしょうか?




nabedge

unread,
Apr 10, 2014, 2:23:21 AM4/10/14
to mixe...@googlegroups.com
こんな感じでしょうか。
https://github.com/nabedge/mixer2-sample-misc/tree/master/src/test/resources/org/mixer2/sample/misc
https://github.com/nabedge/mixer2-sample-misc/blob/master/src/test/java/org/mixer2/sample/misc/ReplaceSample01.java

divとかbodyとかpとかでgetContent()すると、得られるのが List<Object> なので、
そこで戸惑ってしまうのかもしれません。
しかし、よくよく考えてみてください。
「タグの中身は、別のタグか、文字列か、の二種類しかありえない」
です。
だとすれば、instanceof AbstractJaxb での判定がfalseの場合には
必ずそいつはStringです。素直にStringにキャストしてしまえます。
そして、そのままinsertBeforeId(), insertAfterId()に渡せます。


2014年4月10日木曜日 14時19分47秒 UTC+9 ひろ:

ひろ

unread,
Apr 10, 2014, 2:41:53 AM4/10/14
to mixe...@googlegroups.com
欲しかったのはまさしくこのコードです!
ありがとうございました。

※insertBeforeIdには AbstractJaxbしか渡せないと思い込んでました。
 

2014年4月10日木曜日 15時23分21秒 UTC+9 nabedge:
Reply all
Reply to author
Forward
0 new messages