gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:39:22 28 4
gpt4 key购买 nike

我有包含 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(类似于数据处理程序)

...
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

最佳答案

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

您的错误是由基于以下返回值返回的 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 - begin = -1 - 5 = -6)

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

关于java - 从 XML 元素获取 XML 时的标签顺序(XML 包含 XML)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25262301/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com