2012-02-16 195 views
-1

我需要一些幫助讀取一個XML文檔。JAVA,Xml解析

我得到了一個類人,我想從XML

的XML創建一個列表是一樣的東西:

<root> 
<field1></field1> 
<field2></field1> 
<field3></field1> 
<Persons> 
<id></id> 
<List> 
<Person> 
<Name>...</Name> 
<LastName>...</LastName> 
</Person> 
<Person> 
<Name>...</Name> 
<LastName>...</LastName> 
</Person> 
<Person> 
<Name>...</Name> 
<LastName>...</LastName> 
</Person> 
</List 
</Persons> 
<field4></field1> 
<field5></field1> 
<field6></field1> 

</root> 

我使用DOM解析器(org.w3c.dom中)

任何人都可以請sohw我什麼是獲得人員信息的最佳途徑?

感謝

回答

1

如果你想只讀信息,你最好(DOM加載之後)就可以使用XPath。 XPath存在於J2SE API中。如果你需要特殊的例子,請寫。

0

XPath是解決方案之一,

,如果你不希望使用另一個庫...

不是試圖定義DTD和使用ID參數,大部分解析器具有的getElementById(ID )funciton

1

我更喜歡JAXB。它也存在於J2SE API中。

如果您需要幫助,請填寫。

+0

感謝,即時通訊新到Java,ü可以請告訴我一個代碼示例?感謝您的幫助 – ibm123 2012-02-16 16:12:02

+0

因爲您是java的新手,所以我在此示例中添加了如何使用正則表達式的新答案。那個怎麼樣? – ZehnVon12 2012-02-17 08:52:13

+0

感謝您的努力,我將回顧您的回答 – ibm123 2012-02-19 09:34:22

1

我討厭在這裏留下這個,但我回答了類似的問題here

在Java中,您在實際解析XML時有很多選項 - XPath將是最慢的,但會爲您提供一種很好的表達式語言來查詢內容。 DOM將是第二個最慢的,但給你一個樹形模型來記憶你的文檔走路。 SAX會更快,但要求您在動態分析文檔時構建列表,最後STAX將是最快的,但要求您爲自己的格式編寫一些特定的代碼來構建列表。

最後,我會推薦一個我編寫的名爲SJXP的庫,它爲您提供了XPath輕鬆實現的STAX性能......它是兩者的完美結合。

你可以編寫像「/ root/Persons/list/Person/Name」這樣的規則,並給它一個你的文檔,並且每次點擊一個名字並調用用戶提供的回調函數時就會觸發它,找到。

您爲所有您想要的和中提供的值創建了一些規​​則...您可以爲「/ root/Persons/list/Person」開放標籤創建一個START_TAG規則,並創建一個新的「Person p =新的Person()」在你的代碼,然後根據每個子元素命中,您只需設置上的人適當的值,這樣的事情(作爲一個例子):

IRule linkRule = new DefaultRule(Type.CHARACTER, "/root/Persons/list/Person/Name") { 
    @Override 
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) { 
     // Get the last person we added on open-tag. 
     Person p = personList.get(personList.size() - 1); 

     // <Name> tag was parsed, 'text' is our parsed Name. Set it. 
     p.setName(text); 
    } 
} 

約SJXP的好處是,內存開銷低於其他解析器方法並且性能更高(SAX將解析匹配上的元素,基於STAX的解析不會在流請求之前解析出流中的元素)。

爲了遍歷DOM和所有Node元素來構建你的列表,你最終會寫同樣令人困惑的代碼。最後,如果你對XML-> Object映射感到滿意,你可以做別人說的和利用JAXB的東西。你將需要爲你的XML文件編寫一個模式,然後它會爲你生成完美映射的Java對象。然後,您可以將XML文件直接映射到Java對象,並調用類似「persons.getList()」或JAXB爲您生成的任何內容。

在這種情況下(大致),內存開銷和性能將與DOM解析一致。

+1

JAXB不需要XML模式。您可以從Java類開始並添加註釋來自定義XML表示形式:http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/TheBasics – 2012-02-16 16:49:00

+1

Doh,忘記了annot。好的修正@BlaiseDoughan。上次我使用JAXB的時候,它和Castor之間有一些相當複雜的模式,所以我對它有點不熟悉。 – 2012-02-16 21:40:13

0

另一個簡單的方法是使用正則表達式:

Pattern pattern = Pattern.compile("<Person>.*?<Name>(.*?)</Name>.*?<LastName>(.*?)</LastName>.*?</Person>", Pattern.MULTILINE | Pattern.DOTALL); 
Matcher matcher = pattern.matcher(xml); 
while (matcher.find()) 
{ 
    String name = matcher.group(1); 
    String lastName = matcher.group(2); 
} 

存儲在自己的人員,數據結構網絡化的名稱和lastName。

將Pattern.compile命令定義爲方法外的常量,因爲它需要時間進行初始化。

請參閱 http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html