0

同じ親子タグを持つ 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>

この例では、 nameAVPのタグに同じ name の子タグがあり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、set メソッドが次のようなクラスです。

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
..
4

1 に答える 1

0

私があなたの目標を正しく達成したら、「AVP-Structure」を構築し、その後必要な出力を抽出するという方法でそれを行います。

したがって、新しい AVP が開始されると、次のようになります (疑似コードのみ)。

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

解析後、階層を取得し、必要に応じて構造体/結果を構築します。

于 2012-11-05T10:36:15.647 に答える