我有包含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;
}NotificationRequest
@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 (类似于数据处理程序)
...
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
发布于 2014-08-12 16:56:40
您的代码与您所显示的输入一样,似乎没有任何问题。您可能没有向我们展示的是整个输入流或显示整个工作流的主要方法。
您的错误是由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 (end =-1-5= -6)。
我的建议是清理您的代码并添加一些错误保护,并向我们展示我们可能丢失的其他任何东西。
https://stackoverflow.com/questions/25262301
复制相似问题