java - 基于具有自定义逻辑的模板转换 XML。哪个框架?如何实现流媒体播放?

标签 java xml

我想用自定义逻辑修改 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/

相关文章:

java - 当 ListModel 在 Java 中更改时,如何更新 JList?

xml - 你总是必须有一个带有 xml/xsd 的根节点吗?

java - 在 TextView 中显示评论/在编辑 View 中接受评论以在测验应用程序中使用

python - 如何从 DOC(而不是 DOCX)获取 XML?

java - 尝试重复计算一个数字时陷入循环

java - Spring 支持 MIME 类型 "multipart/byteranges"

xml - 在 XSL 转换中为命名空间使用变量

android - 如何在框架布局或线性布局内创建全屏视频 View

java.lang.NoClassDefFoundError : Could not initialize class XXX

java - 在 JSP/Java 中,如何用 s.th. 替换 getter/setter。更通用?