Java 如何部分解析XML(仅1级) 输入(fullInput)

Java 如何部分解析XML(仅1级) 输入(fullInput),java,xml,jaxb,unmarshalling,stax,Java,Xml,Jaxb,Unmarshalling,Stax,假设我将以下内容作为输入流(或者作为从该流读取的字符串)存储在内存中: 我在找什么 我正在寻找bridgeXml的/idea实现,其中输入String/*流被分割成更小的字符串,这些字符串本身就是格式良好的XML文档(没有XML声明) 我希望避免的琐碎实现 下面的实现容易出错,不灵活,不应该使用,我正在寻找一个使用某种库或XML解析器的合适实现 List<String> bridgeXml(String input) { // strip anything up to the

假设我将以下内容作为
输入流
(或者作为从该流读取的
字符串
)存储在内存中:

我在找什么 我正在寻找
bridgeXml
的/idea实现,其中输入
String
/
*流
被分割成更小的字符串,这些字符串本身就是格式良好的XML文档(没有XML声明)

我希望避免的琐碎实现 下面的实现容易出错,不灵活,不应该使用,我正在寻找一个使用某种库或XML解析器的合适实现

List<String> bridgeXml(String input) {
    // strip anything up to the opening root element, and LTrim the remainder
    input = input.replaceAll("(?s)^.*<root.*?>\\s*", "");
    // strip anything after the closing root element, and RTrim the remainder
    input = input.replaceAll("(?s)\\s*</root.*$", "");
    // split at </element> closing tags, not removing them (?<= does the magic)
    return Arrays.asList(input.split("(?<=</element>)"));
}

下面是一个示例xml的litte stax解析器:

String xml = "<root><element>test</element></root>";
XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLStreamReader xmlr = xmlif.createXMLStreamReader(new StringReader(xml));
while (xmlr.hasNext()) {
    xmlr.next();
    if (xmlr.isStartElement() || xmlr.isEndElement()) {
        System.out.println(xmlr.getLocalName() + " " + xmlr.getEventType());
    }
}
stringxml=“测试”;
XMLInputFactory xmlif=XMLInputFactory.newInstance();
XMLStreamReader xmlr=xmlif.createXMLStreamReader(新的StringReader(xml));
while(xmlr.hasNext()){
xmlr.next();
if(xmlr.isStartElement()| | xmlr.isEndElement()){
System.out.println(xmlr.getLocalName()+“”+xmlr.getEventType());
}
}
在这里,您将看到一个解释,如何将stax与jaxb结合起来


您已经用stax标记了您的问题。这就是我给你的建议。使用它,您可以流式处理xml文档或其中的一部分,并使用JAXB解析有效的子xml。这就是我已经做过的,将非常大的xml文档拆分成一些有趣的部分,作为一个解组器!
List<String> bridgeXml(String input) {
    // strip anything up to the opening root element, and LTrim the remainder
    input = input.replaceAll("(?s)^.*<root.*?>\\s*", "");
    // strip anything after the closing root element, and RTrim the remainder
    input = input.replaceAll("(?s)\\s*</root.*$", "");
    // split at </element> closing tags, not removing them (?<= does the magic)
    return Arrays.asList(input.split("(?<=</element>)"));
}
protected <T> List<T> read(InputStream inputStream, String tagName) throws XMLStreamException,
    TransformerException, DecodingException
{
    List<T> result = new ArrayList<T>();
    XMLInputFactory xmlFactory = XMLInputFactory.newInstance();
    XMLStreamReader xmlReader = xmlFactory.createXMLStreamReader(inputStream, "ISO-8859-1");
    while (xmlReader.hasNext()) {
        xmlReader.next();
        if (xmlReader.isStartElement() && tagName.equals(xmlReader.getLocalName())) {
            String output = getOuterXml(xmlReader);
            @SuppressWarnings("unchecked")
            T object = (T) UNMARSHALLER.unmarshall(output);
            result.add(object);
        }
    }
    return result;
}

protected String getOuterXml(XMLStreamReader xmlr) throws TransformerException
{
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    StringWriter stringWriter = new StringWriter();
    transformer.transform(new StAXSource(xmlr), new StreamResult(stringWriter));
    return stringWriter.toString();
}

protected <T> List<T> getObjects(String urlString, String tagName)
{
    LOG.info("Downloading [{}] updates from [{}].", tagName, urlString);
    HttpURLConnection conn = null;
    InputStream inputStream = null;
    try {
        URL url = new URL(urlString);
        conn = (HttpURLConnection) url.openConnection();
        conn.connect();
        inputStream = conn.getInputStream();
        return read(inputStream, tagName);
    } catch (Exception ex) {
        String exceptionMessage = "Updating [" + tagName + "] from [" + urlString + "] failed.";
        LOG.error(exceptionMessage, ex);
        throw new MyFancyWrapperException(exceptionMessage, ex);
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException ex) {
                LOG.warn("Cannot close HTTP's input stream", ex);
            }
        }
        if (conn != null) {
            conn.disconnect();
        }
    }
}
String xml = "<root><element>test</element></root>";
XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLStreamReader xmlr = xmlif.createXMLStreamReader(new StringReader(xml));
while (xmlr.hasNext()) {
    xmlr.next();
    if (xmlr.isStartElement() || xmlr.isEndElement()) {
        System.out.println(xmlr.getLocalName() + " " + xmlr.getEventType());
    }
}