2012-11-01 69 views
0

我想解析具有相同父 - 子標記的XML,然後將父標記的值鏈接到子標記最好使用SAX解析器。解析具有相同父 - 子標記的XML,然後使用SAX解析器將父標記的值鏈接到子標記

這是XML文件

<?xml version="1.0" encoding="UTF-8"?> 

<!-- Protocol header --> 
<Protocol id="Diameter customer, country" spec="RFC3588" 
      name="Diameter" version="1.0" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="file:/$CLASSES/cmg/stdapp/diameter/validation/Diameter_addon_schema.xsd"> 
<!-- ACR declaration: Start --> 
    <Request name="Start"> 
    <Condition key="Accounting-Record-Type" value="2"/> 
    <AVP name="Node-Id" defaultValue="MTAS"/> 
    <AVP name="Session-Id"/> 
    <AVP name="Origin-Host"/> 

     <AVP name="Subscription-Id"> 
      <AVP name="Subscription-Id-Type"/> 
      <AVP name="Subscription-Id-Data"/> 
     </AVP> 
     <AVP name="IMS-Information"> 
      <AVP name="Event-Type"> 
       <AVP name="SIP-Method"/> 
      </AVP> 
      <AVP name="Role-of-Node"/> 
     </AVP> 

    </Request> 
<!----> 


</Protocol> 

在這個例子中使用的名稱AVP標籤具有相同名稱AVP子標籤。我想獲取屬性名稱的值,然後將父項的值與子項的值關聯起來。我爲此使用了 SAX分析器,但我無法區分父代和子代,但沒有區別父代和子代碼。

Java代碼

public void startElement(String s, String s1, String elementName, Attributes attributes) throws SAXException 
{ 
    if (elementName.equalsIgnoreCase("AVP")) 
    { 
     AVP_Tmp = new AVP(); 
     String nameValue = attributes.getValue("name"); 
     if (nameValue == null) 
     { 
      nameValue =attributes.getValue("value"); 
     } 
     if (nameValue != null) 
     { 
      AVP_Tmp.set(nameValue,elementName,attributes); 
     } 
    } 
} 

@Override 
public void endElement(String s, String s1, String element) throws SAXException 
{ 
    if (element.equals("AVP")) 
    { 
     Object key = AVP_Tmp.tmpValue; 
     Object value = AVP_Tmp.tmpValue; 
     AVPL.put(key, value);      
    } 
} 

AVP_Tmp是一類,它的設置方法如下:

public void set(String nameValue, String qName, Attributes attrs)//, int k) 
{ 
    int len = attrs.getLength(); 
    tmpValue=qName + "-->" + nameValue; 
    List list = new ArrayList(); 
    for (int i = 0; i < len; i++) 
    { 
     list.add(attrs.getQName(i)); 
    } 
    Collections.sort(list); 
    for (int i = 0; i < len; i++) 
    { 
     name1[i]= (Object)list.get(i); 
     value1[i]=(attrs.getValue((String) list.get(i))); 
     tmpValue=tmpValue+ "\n" +name1[i]+"="+value1[i]; 
    } 
} 

我目前有輸出:

Node-Id 
.. 
.. 
Subscription-Id 
Subscription-Id-Type 
IMS-Information 
Event-Type 
SIP-Method 
.. 

我要像格式輸出:

Node-Id 
.. 
.. 
.. 
Subscription-Id#Subscription-Id-Type 
IMS-Information#Event-Type#SIP-Method 
.. 

回答

0

我收到了你的目標吧,我會做到這一點,你建「AVP-結構」事後提取所需的輸出。

因此,當一個新的AVP啓動時,它會尋找類似的東西(只是在僞代碼):

if (parent == null){ 
    avpTemp = new AVP(); 
    parent = avpTemp; 
} else {avpTemp = new AVP(parent); } 

解析後,你得到了層次結構,並建立structe /結果,只要你想它。

+0

什麼是父母這裏???????和構造函數AVP(父母) – user1790993

+0

成員父母只是AVP,它是您的XML中的「父母」。構造函數允許你設置一個。解析完成後,您將獲得對象形式的XML結構。 –

+0

您是否可以稍微詳細說明一下代碼,因爲它包含在startElement中? – user1790993