解析具有相同父子标签的 XML,然后最好使用 SAX 解析器将父标签的值链接到子标签

Posted

技术标签:

【中文标题】解析具有相同父子标签的 XML,然后最好使用 SAX 解析器将父标签的值链接到子标签【英文标题】:Parse an XML having same parent-child tag and then link the value of parent tag to child tag using preferably SAX parser 【发布时间】:2012-10-21 22:45:24 【问题描述】:

我想解析一个具有相同父子标签的 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是一个类,其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
..

【问题讨论】:

【参考方案1】:

当我的目标正确时,我会这样做,即构建“AVP-Structure”,然后提取所需的输出。

所以当一个新的 AVP 启动时,它会看起来像这样(只是在伪代码中):

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

解析后,您就获得了层次结构并根据需要构建结构/结果。

【讨论】:

成员父级只是 AVP,它是您 XML 中的“父级”。构造函数允许您设置一个。解析后,您将获得对象形式的 XML 结构。 您能否再详细说明一下要包含在 startElement 中的代码?

以上是关于解析具有相同父子标签的 XML,然后最好使用 SAX 解析器将父标签的值链接到子标签的主要内容,如果未能解决你的问题,请参考以下文章

获取与具有特定值的标签相同的父标签内的标签的值

html和xml里面的文档类型声明(doctype)有啥作用?

流分析解析 json,相同的 key 可以是数组,也可以不是

反序列化具有不同标签的 XML 相同项目

JSON概述

如何使用基于标签的 XML::Twig 解析器在 Unix 上清理 xml 文件 [关闭]