在JAVA中,当父标记和子标记相同时解析XML
快速提问。我有与下面类似的XML在JAVA中,当父标记和子标记相同时解析XML,java,xml,Java,Xml,快速提问。我有与下面类似的XML <dst_adtr> <dst_adtr> <Name>TEST Name</Name> <Table>objects</Table> </dst_adtr> </dst_adtr> <dst_adtr>
<dst_adtr>
<dst_adtr>
<Name>TEST Name</Name>
<Table>objects</Table>
</dst_adtr>
</dst_adtr>
<dst_adtr>
<dst_adtr>
<Name>TEST Name TWO</Name>
<Table>objects</Table>
</dst_adtr>
</dst_adtr>
测试名称
物体
测试名称二
物体
正如您所看到的,父标记和子标记是相同的。
我希望能够搜索并提取
标记中的信息。我怎样才能明确地找到Name标记?如果您的模式总是包含上述格式,那么您可以使用SAX解析器,每次遇到新的dst_adtr节点时,创建一个新的POJO并获取名称和表体信息。如果不想手动解析内容,请使用JAXB。创建一个xsd文件并自动生成POJO和post,您只需调用unmarshall即可从xml提取数据。一个选项是您可以将xml作为字符串读取,并使用正则表达式进行匹配
(?:<Name>(.*?)</Name>)
(?:(.*))
然后,您可以提取所有匹配项。使用拉式解析器且无外部依赖项的示例:
public void pullParse(InputStream in)
throws FactoryConfigurationError, XMLStreamException {
XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
XMLEventReader reader = factory.createXMLEventReader(in);
boolean inName = false;
while (reader.hasNext()) {
XMLEvent o = reader.nextEvent();
if (inName && o.isCharacters()) {
System.out.println("name: " + o.asCharacters().getData());
} else if (inName && o.isEndElement()
&& "Name".equals(o.asEndElement().getName().toString())) {
inName = false;
}
if (o.isStartElement()
&& "Name".equals(o.asStartElement().getName().toString())) {
inName = true;
}
}
}