首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从XML元素获取XML时标记顺序(XML包含XML)?

从XML元素获取XML时标记顺序(XML包含XML)?
EN

Stack Overflow用户
提问于 2014-08-12 10:43:52
回答 1查看 100关注 0票数 0

我有包含XML的XML,我希望使用JAXB解析它。

代码语言:javascript
复制
<DATA>qwqweqwe<aa>zxc</aa></DATA><TEMPM>asdasd<aa /> eee</TEMPM>

解析器

代码语言:javascript
复制
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;
}

NotificationRequest

代码语言:javascript
复制
@XmlAnyElement(value = XMLParserDataHandler.class)
public String DATA;
@XmlAnyElement(value = XMLParserTempmHandler.class)
public String TEMPM;

XMLPArserDataHandler

代码语言:javascript
复制
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 (类似于数据处理程序)

代码语言:javascript
复制
...
private static final String PARAMETERS_START_TAG = "<TEMPM>";
private static final String PARAMETERS_END_TAG = "</TEMPM>";
....

当我跑的时候

代码语言:javascript
复制
    NotificationRequest request = XMLParser.parse(xml);

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

我看到了输出

代码语言:javascript
复制
null
qwqweqwe<aa>zxc</aa>

当我将XML中的顺序更改为

代码语言:javascript
复制
<TEMPM>asdasd<aa /> eee</TEMPM><DATA>qwqweqwe<aa>zxc</aa></DATA>

我搞错了

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2014-08-12 16:56:40

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

您的错误是由substring方法引起的,该方法基于以下对象返回的值返回:

代码语言:javascript
复制
int beginIndex = xml.indexOf(PARAMETERS_START_TAG)
        + PARAMETERS_START_TAG.length();
int endIndex = xml.indexOf(PARAMETERS_END_TAG);

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

代码语言:javascript
复制
beginIndex: -1 + 6 = 5
endIndex: -1

然后,substring将返回一个错误,其无效索引为-6 (end =-1-5= -6)。

我的建议是清理您的代码并添加一些错误保护,并向我们展示我们可能丢失的其他任何东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25262301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档