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

时间:2012-03-07 13:24:55

标签: java

我在解析具有不同标签的xml时遇到问题。下面是我要解析的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>

3 个答案:

答案 0 :(得分:2)

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

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

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

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

如果您的文档不是太大 - 我建议您使用DOM,这将更容易实现。

编辑: 我正在接听电话,所以请原谅我的错误。

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

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

答案 1 :(得分:1)

我没有在问题中看到任何问题。如果您知道如何使用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();
        }
    }
}

答案 2 :(得分:1)

您编写了一个XSLT,您可以根据需要将输入XML的数据放入单独的结构中,并且通过XSLT解析XML非常容易