使用sax解析器解析xml具有不同的标签

问题描述:

我解析XML有不同的tags.Below是我想解析的xml,我想要的是,在主数据存储在单独的数据结构和数据在二级标签存储在不同的数据结构。任何人都可以帮助。提前感谢。使用sax解析器解析xml具有不同的标签

<Alerts> 
    <Secondary> 
    <FIRST_NAME>aaa</FIRST_NAME> 
    <EquicomAlerts> 
     <channelAlertStates> 
     <alertStates channel="ONLINE"> 
      <state name="CREATED" date="2012-01-11" /> 
     </alertStates> 
     </channelAlertStates> 
    </EquicomAlerts> 
    </Secondary> 
    <Primary> 
    <FIRST_NAME>bbb</FIRST_NAME> 
    <EquicomAlerts> 
     <channelAlertStates> 
     <alertStates channel="OffLINE"> 
      <state name="Destroyed" date="2012-01-11" /> 
     </alertStates> 
     </channelAlertStates> 
    </EquicomAlerts> 
    </Primary> 
</Alerts> 
+0

为什么投下来? – Rookie 2012-03-07 13:31:18

+0

你的困难并不那么明显,所以我假设你之前没有使用过SAX。我发布了一个答案 - 希望它现场。 – RonK 2012-03-07 13:44:54

+0

当你说“我有问题”时,你应该更具体一些。什么样的问题?你使用的是什么版本的Java?你看到异常吗?如果你这样做,通过一切手段与我们分享...你需要从你的XML的具体数据?一个对象模型?我敢打赌,有很多人愿意提供帮助,但首先我们需要了解你的问题是什么...... – jambriz 2012-03-07 20:15:46

当使用SAX解析XML时,您需要实现一个ContentHandler。 当解析器击中XML中的任何节点时,ContentHandler会获取事件。

您需要查看何时获取启动Primary元素的事件,并将解析器找到的所有内容放入适当的数据结构中。

一旦您收到解析器通知Secondary元素开始 - 您应该切换到第二个数据结构。

您应该阅读一些关于SAX解析器的知识,以了解如何正确实现它。

如果你的文档不是太大 - 我推荐使用DOM来代替,它会更容易实现。

编辑: 我从我的电话回答,所以请原谅任何错误。

SAX是一种解析XML的事件驱动方式。
您将需要实施方法,如startElement,endElementreadCharacters(可能是最后一个错误的名称)。这些都是有目的的 - 你应该阅读它们。基本上你的内容处理程序需要接收这些事件并相应地处理数据的读取。

尝试编写一个示例内容处理程序并进行调试以了解其工作原理 - 这是我可以给你的最佳建议。

+0

嘿,你能帮助我吗?我不知道该怎么做。 – Rookie 2012-03-07 13:55:11

我在问题中看不到任何问题。如果你知道如何使用Java来解析xml,那么你所要求的很容易实现。基于标签名称,您需要填充您选择的数据结构。下面的代码可能不是最优的,但工作。有许多xml-to-java绑定框架,比如jaxb,castor,xmlbeans等。你可以使用其中的任何一个来简化你的生活。您也可以使用xpath api进行解析。

import java.io.IOException; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 

public class ExampleDOMParser { 


    public static void main(String args[]) { 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     try { 

      DocumentBuilder db = dbf.newDocumentBuilder(); 
      Document dom = db.parse("test.xml"); //Feed your XML.. 

      Node rootNode = dom.getChildNodes().item(0); 
      NodeList nodeList = rootNode.getChildNodes(); 
      for(int i=0;i < nodeList.getLength();i++){ 
       System.out.println(nodeList.item(i).getNodeName()); 
       Node childNode = nodeList.item(i); 

       if(childNode.getNodeType() != Node.TEXT_NODE && 
         childNode.getNodeName().equals("Secondary")){ 
        // TODO: Drill down using DOM API to populate your datastructure 
       } 
       else if(childNode.getNodeType() != Node.TEXT_NODE && 
         childNode.getNodeName().equals("Primary")){ 
        //TODO: Drill down using DOM API to populate your datastructure 
       } 

      } 

     } catch (ParserConfigurationException pce) { 
      pce.printStackTrace(); 
     } catch (SAXException se) { 
      se.printStackTrace(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
    } 
} 

你写一个XSLT通过它可以把输入的XML数据转换成单独的结构按照您的要求,并通过XSLT解析XML是很容易