解析具有相同父 - 子标记的XML,然后使用SAX解析器将父标记的值链接到子标记
问题描述:
我想解析具有相同父 - 子标记的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
..
答
我收到了你的目标吧,我会做到这一点,你建“AVP-结构”事后提取所需的输出。
因此,当一个新的AVP启动时,它会寻找类似的东西(只是在伪代码):
if (parent == null){
avpTemp = new AVP();
parent = avpTemp;
} else {avpTemp = new AVP(parent); }
解析后,你得到了层次结构,并建立structe /结果,只要你想它。
什么是父母这里???????和构造函数AVP(父母) – user1790993
成员父母只是AVP,它是您的XML中的“父母”。构造函数允许你设置一个。解析完成后,您将获得对象形式的XML结构。 –
您是否可以稍微详细说明一下代码,因为它包含在startElement中? – user1790993