使用 Stax 解析器时如何定义 *start* 和 *end* 标签?
How do I define *start* and *end* tags when using the Stax parser?
我有一个很大的 XML 文件,我需要从中解析一些元素。
<root>
<head>
<version>1.1</version>
</head>
<body>
<ele1>value</ele1>
<ele2>
<suvEle1>value</suvEle1>
</ele2>
<ele3>
<suvEle1>value</suvEle1>
</ele3>
</body>
</root>
我想读取 <body>
中的所有元素。但是 - 除了 <body>
标签 - <body>
内的所有其他标签都是动态的。使用 Stax 解析器时如何定义 start 和 end 标签?
您可以使用 XMLStreamConstants.START_ELEMENT and XMLStreamConstants.END_ELEMENT 来确定开始和结束标记。类似于以下内容。
import java.io.StringReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
public static void testStaxParser() {
String xmlSource = "<root>" +
"<head>" +
"<version>1.1</version>" +
"</head>" +
"<body>" +
"<ele1>value</ele1>" +
"<ele2>" +
"<suvEle1>value</suvEle1>" +
"</ele2>" +
"<ele3>" +
"<suvEle1>value</suvEle1>" +
"</ele3>" +
"</body>" +
"</root>";
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader =
factory.createXMLStreamReader(
new StringReader(xmlSource));
while(reader.hasNext()){
int parseEvent = reader.next();
if (parseEvent == XMLStreamConstants.START_ELEMENT){
if ("body".equals(reader.getLocalName())) {
System.out.println("Start of body element.");
processElements(reader);
return;
}
}
}
}
catch (Exception e){
e.printStackTrace(System.err);
}
}
public static void processElements(XMLStreamReader reader) throws XMLStreamException {
do {
int parseEvent = reader.next();
switch(parseEvent){
case XMLStreamConstants.START_ELEMENT:
System.out.println("Start of element " + reader.getLocalName());
break;
case XMLStreamConstants.CHARACTERS:
System.out.println("Element content is " + reader.getText().trim());
break;
case XMLStreamConstants.END_ELEMENT:
if ("body".equals(reader.getLocalName())) {
System.out.println("End of body element.");
return;
}
System.out.println("End of element " + reader.getLocalName());
break;
}
} while (reader.hasNext());
}
我有一个很大的 XML 文件,我需要从中解析一些元素。
<root>
<head>
<version>1.1</version>
</head>
<body>
<ele1>value</ele1>
<ele2>
<suvEle1>value</suvEle1>
</ele2>
<ele3>
<suvEle1>value</suvEle1>
</ele3>
</body>
</root>
我想读取 <body>
中的所有元素。但是 - 除了 <body>
标签 - <body>
内的所有其他标签都是动态的。使用 Stax 解析器时如何定义 start 和 end 标签?
您可以使用 XMLStreamConstants.START_ELEMENT and XMLStreamConstants.END_ELEMENT 来确定开始和结束标记。类似于以下内容。
import java.io.StringReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
public static void testStaxParser() {
String xmlSource = "<root>" +
"<head>" +
"<version>1.1</version>" +
"</head>" +
"<body>" +
"<ele1>value</ele1>" +
"<ele2>" +
"<suvEle1>value</suvEle1>" +
"</ele2>" +
"<ele3>" +
"<suvEle1>value</suvEle1>" +
"</ele3>" +
"</body>" +
"</root>";
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader =
factory.createXMLStreamReader(
new StringReader(xmlSource));
while(reader.hasNext()){
int parseEvent = reader.next();
if (parseEvent == XMLStreamConstants.START_ELEMENT){
if ("body".equals(reader.getLocalName())) {
System.out.println("Start of body element.");
processElements(reader);
return;
}
}
}
}
catch (Exception e){
e.printStackTrace(System.err);
}
}
public static void processElements(XMLStreamReader reader) throws XMLStreamException {
do {
int parseEvent = reader.next();
switch(parseEvent){
case XMLStreamConstants.START_ELEMENT:
System.out.println("Start of element " + reader.getLocalName());
break;
case XMLStreamConstants.CHARACTERS:
System.out.println("Element content is " + reader.getText().trim());
break;
case XMLStreamConstants.END_ELEMENT:
if ("body".equals(reader.getLocalName())) {
System.out.println("End of body element.");
return;
}
System.out.println("End of element " + reader.getLocalName());
break;
}
} while (reader.hasNext());
}