代码之家  ›  专栏  ›  技术社区  ›  cthulhu

将XML结构解析为一组简单、通用的映射和列表

  •  2
  • cthulhu  · 技术社区  · 15 年前

    有点相关 How to convert XML to java.util.Map and vice versa

    我有一个XML文档,我想将它转换为一组非常通用的键/值对(即Java)。基本思想是我们可以解析几乎所有的XML文档并将其直接传递给JSP文件,JSP文件可以读取并显示这些值。

    假设有一个XML结构,如下所示:

    <root>
      <items>
       <item id="10">Some item here</item>
      </items>
      <things>
       <thing awesome="true">
        <orly-owl hoot="woot" />
       </thing>
      </things>
    </root>
    

    输出将是一组包含值、列表和其他映射的映射对象。理想情况下,它是如何在(伪)JSP文件中读取的:

    <c:forEach var="item" items="${root.items}">
      ${item.id}
      ${item.text}
    </c:forEach>
    <c:forEach var="things" items="${root.things}">
      Is it awesome? ${thing.awesome}
      orly? ${thing.orly-owl.hoot}
    </c:forEach>
    

    基本上,它是一个xml解析器,有一组简单的规则。

    它有子节点吗?

    以节点名为键,以列表(地图)为值,向地图添加条目 它有属性或价值吗? 将条目添加到以属性名称为键、属性值为值的映射中

    所以我的问题是:有没有现成的解析器可以这样做?

    我今天找到并试用过的所有对象都映射到一个固定的对象层次结构,也就是说,您必须创建一个根对象,其中包含具有自己属性的Item对象列表。这一点不错(而且可以基于(要编写/设计的)DTD对象自动生成),但我当前的任务是尝试这两个选项。尝试了第一种,一旦那些映射xml文件对我有意义并且错误消息开始告诉我我做错了什么,但是还没有弄清楚如何做第二种(读:编写递归的xml解析器(dom或sax))。

    这个问题可能缺乏连贯性,现在是五点钟。


    <root thing="thine mother">
      <thing mabob="yus" />
      <thing mabob="nay" />
      <items>
        <item id=1" />
      </items>
    </root>
    

    如果不事先分析结构(并设置一个类似于“在这个特定元素下有相同的命名元素和唯一的命名元素”的标志),您就不能假设这一点。我最不想做的就是强制XML符合特定的结构。

    不管怎样。感谢大家的建议,这似乎不是一个非常合理的解决问题的方法——至少在不破坏XML的基本规则和约定以及常识的情况下是这样。

    接下来的想法是让JSP直接使用xmljstl库呈现文档。

    4 回复  |  直到 9 年前
        1
  •  2
  •   Anon    15 年前

    好像 JSTL XML bindings 会做你想做的事。

    使用列表和映射不太可能找到完全满足需求的内容,这是因为XML不能很好地转换为列表和映射(主要是因为“如何区别对待属性和内容?”)。

        2
  •  3
  •   Paul Gregoire    15 年前

    JDOM当然可以为您提供从元素构建的列表。这个图书馆已经有相当长的一段时间了,很容易使用。 http://jdom.org/

        3
  •  1
  •   Community Mohan Dere    11 年前
        4
  •  1
  •   Nathan Hughes    15 年前

    这个 apache-commons Digester

    如果你想知道如何做递归解析,你可以看看 this article 一个有趣的方法(使用递归转换网络)。其思想是创建一个显示xml元素之间关系的对象网络,并在使用堆栈进行解析时跟踪您在该网络中的位置。

    推荐文章