我在解析具有不同标签的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>
答案 0 :(得分:2)
使用SAX解析XML时,需要实现ContentHandler
。
当解析器访问XML中的任何节点时,ContentHandler
会获取事件。
您需要查看何时获得启动Primary
元素的事件,并将解析器找到的所有内容放在适当的数据结构中。
解析器通知Secondary
元素开始后 - 您应切换到第二个数据结构。
您应该阅读一些关于SAX解析器的内容,以了解如何正确实现它。
如果您的文档不是太大 - 我建议您使用DOM,这将更容易实现。
编辑: 我正在接听电话,所以请原谅我的错误。
SAX是一种以事件驱动的方式来解析XML
您需要实现startElement
,endElement
和readCharacters
等方法(可能是最后一个错误的名称)。每个都有一个目的 - 你应该阅读它们。基本上,您的内容处理程序需要接收这些事件并相应地处理数据读取。
尝试编写示例内容处理程序并对其进行调试以了解其工作原理 - 这是我能给你的最佳建议。
答案 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非常容易