从XML元素获取XML时的标签顺序(XML包含XML)?

时间:2014-08-12 10:43:53

标签: java xml jaxb

我有包含XML的XML,我想用JAXB解析它

<DATA>qwqweqwe<aa>zxc</aa></DATA><TEMPM>asdasd<aa /> eee</TEMPM>

解析器

public static NotificationRequest parse(String xml)
        throws ParserConfigurationException, SAXException, JAXBException {
    xml = makeXMLValid(xml);
    NotificationRequest ret = new NotificationRequest();

    JAXBContext jaxbContext = JAXBContext
            .newInstance(NotificationRequest.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    ret = (NotificationRequest) jaxbUnmarshaller
            .unmarshal(new StringReader(xml));

    return ret;
}

通知请求

@XmlAnyElement(value = XMLParserDataHandler.class)
public String DATA;
@XmlAnyElement(value = XMLParserTempmHandler.class)
public String TEMPM;

XMLPArserDataHandler

private static final String PARAMETERS_START_TAG = "<DATA>";
private static final String PARAMETERS_END_TAG = "</DATA>";
private StringWriter xmlWriter = new StringWriter();

@Override
public StreamResult createUnmarshaller(ValidationEventHandler errorHandler) {
    return new StreamResult(xmlWriter);
}

@Override
public String getElement(StreamResult rt) {
    String xml = rt.getWriter().toString();
    int beginIndex = xml.indexOf(PARAMETERS_START_TAG)
            + PARAMETERS_START_TAG.length();
    int endIndex = xml.indexOf(PARAMETERS_END_TAG);
    return xml.substring(beginIndex, endIndex);
}

@Override
public Source marshal(String n, ValidationEventHandler errorHandler) {
    try {
        String xml = PARAMETERS_START_TAG + n.trim() + PARAMETERS_END_TAG;
        StringReader xmlReader = new StringReader(xml);
        return new StreamSource(xmlReader);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

XMLParserTampmHandler(类似于DATA处理程序)

...
private static final String PARAMETERS_START_TAG = "<TEMPM>";
private static final String PARAMETERS_END_TAG = "</TEMPM>";
....

当我跑步时

    NotificationRequest request = XMLParser.parse(xml);

    System.out.println(request.TEMPM);
    System.out.println(request.DATA);

在输出时我看到

null
qwqweqwe<aa>zxc</aa>

当我将XML中的顺序更改为

<TEMPM>asdasd<aa /> eee</TEMPM><DATA>qwqweqwe<aa>zxc</aa></DATA>

我收到错误

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -6

XMLParserDataHandler.java:29

当我只使用一个@XmlAnyElement注释时,一切正常。

如何使用JAXB从XML中使用多个包含XML的标记来更新XML?


我创建了一个新的简单项目。它显示代码http://pastebin.com/apJf0D72

1 个答案:

答案 0 :(得分:1)

您的代码原样,您显示的输入似乎没有任何问题。您可能没有向我们展示的是整个输入流或显示整个工作流程的主要方法。

您的错误是由基于返回值返回的substring方法引起的:

int beginIndex = xml.indexOf(PARAMETERS_START_TAG)
        + PARAMETERS_START_TAG.length();
int endIndex = xml.indexOf(PARAMETERS_END_TAG);

假设您有一行不包含这些标记,您的返回值将为:

beginIndex: -1 + 6 = 5
endIndex: -1
然后

substring会返回一个无效索引为-6的错误(结束 - 开始= -1 - 5 = -6)

我的建议是清理代码并添加一些错误保护,并向我们展示我们可能遗漏的任何其他内容。