2012-11-16 22 views
0

我想分析這種XML字符串:如何在標籤內解析帶有數據的XML字符串

<Objects> 
    <Object type="crs" obj_id="192"> 
     <Title>Course 1</Title> 
     <Description>this is description</Description> 
     <CreateDate>2012-10-16 12:53:12</CreateDate> 
     <LastUpdate>2012-10-16 12:53:54</LastUpdate> 
    </Object> 

    <Object type="frm" obj_id="202"> 
     <Title>Forum 1</Title> 
     <Description>this is description</Description> 
     <CreateDate>2012-10-30 01:06:41</CreateDate> 
     <LastUpdate>2012-10-30 01:06:41</LastUpdate> 
    </Object> 
</Objects> 

我已經解析XML字符串具有相同的結構,但只是與標籤<對象> 。現在我想要獲取標籤Object中的信息以獲取type =「xxx」的字符串。

這是我做的一種解析的:

try { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     InputSource xml = new InputSource(); 
     xml.setCharacterStream(xmlSTring); 
     Document doc = db.parse(xml); 
     NodeList nodes = doc.getElementsByTagName("Object"); 

     // iterate objects 
     for (int i = 0; i < nodes.getLength(); i++) { 
      Element element = (Element) nodes.item(i); 
      // get first attribute 
      NodeList ref_id = element.getElementsByTagName("title"); 
      Element line = (Element) ref_id.item(0); 
      System.out.println("title: " + getCharacterDataFromElement(line)); 

     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
private static String getCharacterDataFromElement(Element e) { 
    Node child = e.getFirstChild(); 
    if (child instanceof CharacterData) { 
     CharacterData cd = (CharacterData) child; 
     return cd.getData(); 
    } 
    return "?"; 
} 

在此先感謝。

+0

你有DTD嗎? – durron597

+0

我是一個新手,我不確定什麼是DTD,但是如果有幫助,我可以從soap請求中獲得XML字符串,我不會編輯它。 我的意思是,我只是得到這個代碼,沒有更多。 – Davis

+0

哦,是的...搜索我有一個.dtd文件。 – Davis

回答

1

在主循環

element.getAttribute("type"); 

應該得到你想要的東西。

而不是使用DOM你可以看看STAX

jee5 stax tutorial

+0

哦,那是一個愚蠢的錯誤,謝謝BevynQ。 謝謝大家的提議。我會檢查stax。 – Davis

0

您也可以使用JAXB像這樣的問題。當您有一個示例XML文件時,您可以使用名爲Trang的程序生成xsd。這是我生成使用該程序XML文檔的模式:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="Objects"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" ref="Object"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="Object"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="Title"/> 
     <xs:element ref="Description"/> 
     <xs:element ref="CreateDate"/> 
     <xs:element ref="LastUpdate"/> 
     </xs:sequence> 
     <xs:attribute name="obj_id" use="required" type="xs:integer"/> 
     <xs:attribute name="type" use="required" type="xs:NCName"/> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="Title" type="xs:string"/> 
    <xs:element name="Description" type="xs:string"/> 
    <xs:element name="CreateDate" type="xs:string"/> 
    <xs:element name="LastUpdate" type="xs:string"/> 
</xs:schema> 

然後你就可以使用JAXB生成的對象爲XML文檔和XML綁定到這些對象。

+0

非常感謝C. Trimble – Davis

+0

如果你打算去JAXB路線,我會對這個XSD做一些改變。首先,將兩個日期字段設置爲xs:date。這會在您生成綁定時爲您提供日曆對象。另外,Trang爲你的類型選擇了Object和Objects的名字。我會更改這些以使生成的代碼更具可讀性,或使用xjb綁定文件自定義名稱。 –