【问题标题】:JAVA , Xml parsingJAVA,XML解析
【发布时间】:2012-03-07 17:17:55
【问题描述】:

我需要一些帮助来阅读 xml 文档。

我有一个类人,我想从那个 xml 创建一个列表

xml 类似于:

<root>
<field1></field1>
<field2></field1>
<field3></field1>
<Persons>
<id></id>
<List>
<Person>
<Name>...</Name>
<LastName>...</LastName>
</Person>
<Person>
<Name>...</Name>
<LastName>...</LastName>
</Person>
<Person>
<Name>...</Name>
<LastName>...</LastName>
</Person>
</List
</Persons>
<field4></field1>
<field5></field1>
<field6></field1>

</root>

我正在使用 dom 解析器 (org.w3c.dom)

谁能告诉我获取人员信息的最佳方式是什么?

谢谢

【问题讨论】:

    标签: java xml xml-serialization


    【解决方案1】:

    另一个简单的方法是使用正则表达式:

    Pattern pattern = Pattern.compile("<Person>.*?<Name>(.*?)</Name>.*?<LastName>(.*?)</LastName>.*?</Person>", Pattern.MULTILINE | Pattern.DOTALL);
    Matcher matcher = pattern.matcher(xml);
    while (matcher.find())
    {
      String name = matcher.group(1);
      String lastName = matcher.group(2);
    }
    

    将姓名和姓氏存储在您自己的 Persons-Datastructure 中。

    将 Pattern.compile 命令定义为方法外部的常量,因为它需要时间进行初始化。

    请看 http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

    【讨论】:

      【解决方案2】:

      我不想在这里留下这个,但我回答了一个类似的问题here。

      在 Java 中,您在实际解析 XML 方面有很多选择 - XPath 将是最慢的,但为您提供了一种很好的表达式语言来查询内容。 DOM 将是第二慢的,但会给你一个树模型来记忆你的 doc 行走。 SAX 会更快,但需要您在动态解析文档时构建列表,最后 STAX 将是最快的,但需要您根据格式编写一些特定代码来构建列表。

      最后,我会推荐一个我编写的名为 SJXP 的库,它为您提供 STAX 的性能和 XPath 的易用性......它是两者的完美结合。

      您编写诸如“/root/Persons/list/Person/Name”之类的规则并将其提供给您的文档,它会在每次遇到名称时触发并为您调用用户提供的回调,将找到的名称交给您.

      您为所需的所有值和 viola 创建了一些规​​则...您可以为“/root/Persons/list/Person”打开标签创建一个 START_TAG 规则,并创建一个新的“Person p = new Person()" 在您的代码中,然后当每个子元素命中时,您只需在人上设置适当的值,如下所示(作为示例):

      IRule linkRule = new DefaultRule(Type.CHARACTER, "/root/Persons/list/Person/Name") {
          @Override
          public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
              // Get the last person we added on open-tag.
              Person p = personList.get(personList.size() - 1);
      
              // <Name> tag was parsed, 'text' is our parsed Name. Set it.
              p.setName(text);
          }
      }
      

      SJXP 的好处是内存开销低于其他解析器方法并且性能更高(SAX 将解析匹配的元素,基于 STAX 的解析不会将元素解析出流,直到它们请求)。

      您最终会编写同样令人困惑的代码,只是为了遍历您的 DOM 和所有 Node 元素来构建您的列表。

      最后,如果您对 XML->Object 映射感到满意,您可以照别人说的去做并利用 JAXB。您需要为您的 XML 文件编写一个模式,然后它将为您生成完美映射到它们的 Java 对象。然后,您可以直接将您的 XML 文件映射到您的 Java 对象并调用类似“persons.getList()”或 JAXB 为您生成的任何内容。

      在这种情况下(大致)内存开销和性能将与 DOM 解析相当。

      【讨论】:

      • JAXB 不需要 XML 模式。您可以从 Java 类开始并添加注解来自定义 XML 表示:wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/…
      • Doh,忘记注释了。很好的纠正@BlaiseDoughan。上次我使用 JAXB 是在它和 Castor 之间,有一些相当复杂的模式,所以我有点不了解它。
      【解决方案3】:

      我更喜欢 JAXB。它也存在于 J2SE API 中。

      如果您需要帮助,请写信。

      【讨论】:

      • 谢谢,我是java新手,你能给我看一个代码示例吗?感谢您的帮助
      • 因为您是 java 新手,所以我添加了一个新答案,如何在此示例中使用正则表达式。那怎么样?
      • 感谢您的努力,我会审核您的回答
      【解决方案4】:

      你必须使用Simple API for XML (SAX)。您也可以使用 Streaming API for XML (StaX) (tutorial)。

      【讨论】:

        【解决方案5】:

        XPath 是解决方案之一,

        如果您不想使用其他库...

        比起尝试定义DTD和使用ID参数,大多数解析器都有getElementById(ID)函数

        【讨论】:

          【解决方案6】:

          如果你只想阅读信息,你最好(在加载 DOM 之后)使用 XPath。 XPath 存在于 J2SE API 中。如果您需要特殊示例,请编写。

          【讨论】:

            猜你喜欢
            • 2012-11-17
            • 1970-01-01
            • 2014-05-10
            • 2014-02-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多