我想用自定义逻辑修改 XML 模板,它类似于 XSLT,但有一些自己的功能。 XML 模板文件是干净的并且可以扩展。
<user-list>
<user id="">
<forename></forename>
<lastname></lastname>
<static-information>static</static-information>
<address-list>
<address>
...
</address>
</adress-list>
</user>
</user-list>
现在我收到了该模板的 JDBC 结果集以及数据结构的映射,其中包含有关重复节点(例如此处的“用户”节点)和映射提示(例如“用户/名字”到 FORENAME {a SQL 列} 的信息) )。
<user-list>
<user id="1">
<forename>stack</forename>
<lastname>overflow</lastname>
<static-information>static</static-information>
<address-list>...</adress-list>
</user>
<user id="2">
<forename>questions</forename>
<lastname>answers</lastname>
<static-information>static</static-information>
<address-list>...</adress-list>
</user>
</user-list>
该映射具有内部节点的相关信息,该内部节点应扩展(如果当前用户有多个地址,则该地址应重复。
<query>SELECT * FROM USER</query>
<element>user/address-list/address</element>
<mapping element="street" source="STREET"></mapping>
这可能是一个非常复杂的模型,最多可以包含 10000 个条目。在不知道其结构(除了映射给出的小信息之外)的情况下,如何从一个简单的模板实现转换。我应该选择什么框架?如何实现流媒体播放?我不想在内存中进行转换和映射。每次完成后,例如用户阻止流媒体可以继续。
谢谢
最佳答案
您可以使用 STaX解析器如 Woodstox 。然后创建一个读取循环并在其中嵌入写入命令,根据输入元素写出 XML 元素。
读取简单元素并将其写入输出的示例,<address-list>
除外它创建一系列 <address></address>
的元素其中的子元素:
FileInputStream fis = new FileInputStream(file);
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader staxXmlReader = factory.createXMLStreamReader(fis);
XMLOutputFactory outFactory = XMLOutputFactory.newInstance();
XMLStreamWriter staxWriter = outFactory.createXMLStreamWriter(out);
for (int event = staxXmlReader.next(); event != XMLStreamConstants.END_DOCUMENT;
event = staxXmlReader.next()) {
switch (event) {
case XMLStreamConstants.START_DOCUMENT:
break;
case XMLStreamConstants.START_ELEMENT:
String elementName = staxXmlReader.getLocalName();
if(elementName.equals("address-list")){
staxWriter.writeStartElement(elementName);
String addressText = staxXmlReader.getElementText();
// parse element text
// and loop creating <address> elements
for (..) {
staxWriter.writeStartElement("address"); // write <address>
staxWriter.writeCharacters("address data");
staxWriter.writeEndElement(); // write </address>
}
} else {
// just copy the element
staxWriter.writeStartElement(elementName);
staxWriter.writeCharacters(staxXmlReader.getElementText());
}
break;
case XMLStreamConstants.END_ELEMENT:
staxWriter.writeEndElement();
break;
case XMLStreamConstants.END_DOCUMENT:
staxWriter.writeEndDocument();
break;
default:
break;
}
}
关于java - 基于具有自定义逻辑的模板转换 XML。哪个框架?如何实现流媒体播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4267427/