JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java & XML、Web Service » XML  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 這樣的XML該用什麼方式讀取會比較好呢?
桂正和





發文: 31
積分: 0
於 2010-04-07 11:51 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
各位先進您好~
小弟最近在規畫公司的專案中
因為會用到XML的部分
所以關於XML讀取的部分要請教各位

首先讀取到的XML會像這樣
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<store>
    <books>
        <topbook>
            <book id="1">書本1</book>
            <book id="2">書本2</book>
        </topbook>
        <hotbook>
            <book id="21">書本21</book>
            <book id="22">書本22</book>
        </hotbook>
    </books>
</store>


但是這份XML不是實體文件
而是透過表單送到JSP

發送的方式會像是
http://www.abc.com/api/?xml=(XML內容)
而我要用JSP去做解析

如果單純是抓比較簡單的節點的話
例如
1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<store>
    <book id="1">書本1</book>
    <book id="2">書本2</book>
</store>


這樣的話我是有找到DEMO去抓出來了
只是如果比較複雜的結構就沒辦法

小弟之前本身是寫VB跟ASP的
用M$的XMLDOM是寫得出來

可惜現在是得要用不熟悉的JAVA寫XML
G了一下網路上的資料
光是找到的就有很多種寫法(JDOM、XPath等等)
但是還是試驗不出來= =||

所以小弟厚顏
可以請有經驗的前輩給我點方向嗎@@?
或者是有相關的技術文件可以讓我參考研究

感謝>"<


桂正和 edited on 2010-04-07 11:54
reply to postreply to post
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:桂正和]
L





發文: 34
積分: 0
於 2010-04-07 12:26 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
為什麼一定要用 jsp 去做呢?
mvc 架構弄一弄,在後端 java 做比較好做
可以用 xmlbeans,挺直覺的


reply to postreply to post
L
SCJP, SCWCD, SCBCD
NCLP, OCUP
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:桂正和]
dreamltf

wicket



發文: 645
積分: 5
於 2010-04-07 12:42 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
如果你要用內建的 api 來寫得話,太多code可以參考了

http://www.exampledepot.com/egs/org.w3c.dom/pkg.html
http://www.java2s.com/Code/Java/XML/CatalogXML.htm


reply to postreply to post
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:桂正和]
yuyen





發文: 8
積分: 0
於 2010-04-07 13:35 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我使用過dom4j , 跟jaxb。

dom4j 你要先parseXML轉為XML 的document後再來處理xml內的節點。

可以透過xpath來指定出節點的資料

jaxb的話 可能需要他的xml schema來做第一步的處理。

可以參考
http://www.javaworld.com.tw/jute/post/view?bid=19&id=5482&sty=1&tpg=1&age=-1

https://jaxb.dev.java.net/

http://www.dom4j.org/dom4j-1.6.1/

但是若xml檔案大時 dom4j 是有可能會造成outofmemory的喔。

還是比較建議把xml處理丟到後端給java做,前端單純點比較好。


reply to postreply to post
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:L]
桂正和





發文: 31
積分: 0
於 2010-04-07 13:54 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
L wrote:
為什麼一定要用 jsp 去做呢?
mvc 架構弄一弄,在後端 java 做比較好做
可以用 xmlbeans,挺直覺的


如果可以
我到寧願用ASP寫
一下子就寫完了@@
頂多寫顆元件跑
應付大量傳輸

只是現在原本的架構就是JSP寫的
為了統一
也只能這樣寫@@"

不過您說的我不太了解
像是xmlbeans就沒用過
我得找一下文件來看看

如果要寫Servlet的話
那應該可行

dreamltf wrote:
如果你要用內建的 api 來寫得話,太多code可以參考了

http://www.exampledepot.com/egs/org.w3c.dom/pkg.html
http://www.java2s.com/Code/Java/XML/CatalogXML.htm


我們是用JDOM寫
不過原本寫的都只有一層的架構
所以不清楚如果XML會比較深的話怎麼辦
您的文件我等等就來研究一下
感謝您

感謝各位先進的資料提供
我會趕快來看的@@"
不會寫JAVA的東西
所以各位說的東西我幾乎都沒什麼認知ˊˋ
只能臨時抱佛腳來參考
感謝各位~


reply to postreply to post
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:桂正和]
johnsoh

disney



發文: 456
積分: 0
於 2010-04-07 15:24 user profilesend a private message to usersend email to johnsohreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
桂正和 wrote:

發送的方式會像是
http://www.abc.com/api/?xml=(XML內容)
而我要用JSP去做解析



這樣不會造成url長度超過限制嗎?


reply to postreply to post
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:johnsoh]
qrtt1





發文: 1570
積分: 31
於 2010-04-07 15:28 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
johnsoh wrote:
這樣不會造成url長度超過限制嗎?


ha ha 如果如他說的會到 out of memory 的程度, 肯定超過了


reply to postreply to post
蝸牛角上爭何事?石火光中寄此身,隨富隨貧且歡樂,不開口笑是癡人。
my reading logs
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:桂正和]
johnsoh

disney



發文: 456
積分: 0
於 2010-04-07 15:34 user profilesend a private message to usersend email to johnsohreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
可以考慮用XSL.

reply to postreply to post
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:johnsoh]
桂正和





發文: 31
積分: 0
於 2010-04-07 15:37 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
johnsoh wrote:
這樣不會造成url長度超過限制嗎?


這就是好玩的地方了
電信業者幾乎都用這個方式送XML
連中華電信都是一一

我目前做的東西是自家WEB跟手機做介接用的系統
所以有些規格可以不用跟之前的做法一樣
所以現在打算用POST的方式把資料傳出

我有做一個DEMO頁面做POST的方式
然後再來接收資料
JSP我是不確定接收表單的POST資料會不會有太多問題
目前看起來是OK

所以到時候會請撰寫手機程式的同仁
將資料用POST的方式拋出來給我這裡的Web接收

qrtt1 wrote:
ha ha 如果如他說的會到 out of memory 的程度, 肯定超過了


不用到out of memory 的程度就會有問題
因為GET有長度上的限制
之前有碰過介接的時候
資料就傳太長
結果後面資料都不見的狀況發生

但是現在還是很多業者還樂此不疲用這種方式
很無言一一
用GET傳一堆資料有什麼好?
我真的不懂= =||


reply to postreply to post
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:桂正和]
桂正和





發文: 31
積分: 0
於 2010-04-07 15:45 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不過還是要在此感謝各位
目前現在用最笨的方法解決

就是多利用幾個Element接下去
然後在抓最後面的資料@@
(我是先寫這樣一一||..不知道還有沒有比較快的方式,可以指定節點...)

1
2
3
4
5
6
7
8
9
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build( new StringReader( XMLContent ) );
 
Element xmlroot = doc.getRootElement();
Element elmStore = xmlroot.getChild("store");
if (elmStore==null){return;}
Element elmBuy = elmStore.getChild("buy");
if (elmBuy==null){return;}
List lstGold = elmBuy.getChildren("gold");


這段是去參考的前人留下的程式寫的
至少是可以先解決我的解析問題了= =


reply to postreply to post
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:桂正和]
johnsoh

disney



發文: 456
積分: 0
於 2010-04-07 16:02 user profilesend a private message to usersend email to johnsohreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1
Element elmStore = xmlroot.getChild("store/buy/gold");


reply to postreply to post
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:johnsoh]
桂正和





發文: 31
積分: 0
於 2010-04-07 17:21 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
johnsoh wrote:
1
Element elmStore = xmlroot.getChild("store/buy/gold");



原來如此
之前我是寫
1
List lstGold = xmlroot.getChild("store/buy");

不能用一一|||
原來不該用List去接getChild抓出的節點資料

另外因為我這邊有可能產生出很多筆資料要接收
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<api>
    <store>
        <buy>
            <gold id="1"></gold>
            <gold id="2"></gold>
            <gold id="3"></gold>
        </buy>
    </store>
</api>


所以寫成這樣
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build( new StringReader( XMLContent ) );
 
Element xmlroot = doc.getRootElement();
Element elmBuy = xmlroot.getChild("store/buy");
if (elmBuy==null){return;}
 
List lstGold = elmBuy.getChildren("gold");
intRecordCount = lstGold.size();
 
if ( intRecordCount > 0 ){
  String StrGoldId = "";
  for(int i=0; i<lstGold.size(); i++) {
    Element elmtGold = (Element) lstGold.get(i);
    
    StrGoldId = elmtGold.getAttributeValue("id");
    out.println( "StrGoldId="+StrGoldId );
  }
}


這樣有沒有什麼問題呢@@?
抱歉>"<
如此叨擾~


reply to postreply to post
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:桂正和]
johnsoh

disney



發文: 456
積分: 0
於 2010-04-07 17:26 user profilesend a private message to usersend email to johnsohreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
應該有 sibling 的方法, 無需使用 List.

reply to postreply to post
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:johnsoh]
桂正和





發文: 31
積分: 0
於 2010-04-07 18:02 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
johnsoh wrote:
應該有 sibling 的方法, 無需使用 List.


不過剛剛改成了
1
Element elmBuy = xmlroot.getChild("action/store/buy");

就抓不到節點了@@
檢查發現elmBuy為null

XML內容
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<api>
    <action>
        <store>
            <buy>
                <gold id="1"></gold>
                <gold id="2"></gold>
            </buy>
        </store>
    </action>
</api>


桂正和 edited on 2010-04-07 18:14
reply to postreply to post
作者 Re:這樣的XML該用什麼方式讀取會比較好呢? [Re:桂正和]
johnsoh

disney



發文: 456
積分: 0
於 2010-04-07 18:23 user profilesend a private message to usersend email to johnsohreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
太久沒用了, 用這樣看看

1
Element elmBuy = xmlroot.getChild("//api/action/store/buy/gold");


johnsoh edited on 2010-04-07 18:26
reply to postreply to post
» JWorld@TW »  Java & XML、Web Service » XML

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8