java - 建议用 Java 解析此 XML

标签 java xml xpath xml-parsing

对于 Java 来说并不陌生;但对于 XML 解析来说相对较新。我对许多 XML 工具略知一二,但对其中任何一个都了解不多。我也不是 XML 专家。

我的特殊问题是...我收到了一个无法修改的 XML 文档,我只需要从中将其随机位解析为 Java 对象。只要合理,纯粹的速度并不是一个重要因素。同样,内存占用也不一定是绝对最佳的,只是不疯狂即可。我只需要通读一次文档来解析它,之后我会将它扔到 bitbucket 中并只使用我的 POJO。

所以,我愿意接受建议......您会使用哪个工具?
并且,您能否建议一些入门代码来满足我的特殊需求?

这是示例 XML 的片段以及我正在尝试制作的关联 POJO:

<xml>
  <item id="...">
    ...
  </item>
  <metadata>
    <resources>

      <resource>
        <ittype>Service_Links</ittype>
        <links>
          <link>
            <path>http://www.stackoverflow.com</path>
            <description>Stack Overflow</description>
          </link>
          <link>
            <path>http://www.google.com</path>
            <description>Google</description>
          </link>
        </links>
      </resource>

      <resource>
        <ittype>Article_Links</ittype>
        <links>
          ...
        </links>
      </resource>

      ...

    </resources>
  </metadata>
</xml>


public class MyPojo {

    @Attribute(name="id")
    @Path("item")
    public String id;

    @ElementList(entry="link")
    @Path("metadata/resources/resource/links")
    public List<Link> links;
}

注意:这个问题最初是由 this question 提出的。我尝试使用 SimpleXml 解决它;我认为也许有人可以提出不同的方法来解决同一问题。

另请注意:我真的希望有一个CLEAN解决方案...我的意思是,使用注释和/或 xpath 以最少的代码量...我最不想要的就是带有巨大笨拙方法的巨大类文件...那,我已经有了...我正在努力寻找更好的方法。

:D

最佳答案

好的,所以我选择了一个(对我来说)似乎能以最合理的方式满足我的需求的解决方案。我对其他建议表示歉意,但我只是更喜欢这条路线,因为它保留了大部分解析规则作为注释,而且我必须编写的程序代码非常少。

我最终选择了 JAXB;最初我认为 JAXB 要么从 Java 类创建 XML,要么将 XML 解析为 Java 类,但只能使用 XSD。然后我发现 JAXB 具有注释,可以将 XML 解析为 Java 类,而无需 XSD。

我正在使用的 XML 文件很大而且很深,但我只需要其中的一些片段;我担心 future 导航 map 到哪里会非常困难。因此,我选择构建一个以 XML 为模型的文件夹树...每个文件夹映射到一个元素,并且每个文件夹中都有一个代表该实际元素的 POJO。

问题是,有时有一个元素有一个子元素,它有一个我关心的属性。为了访问单个属性而创建 4 个嵌套文件夹并为每个文件夹创建一个 POJO 将是一件很痛苦的事情。但这就是使用 JAXB 的方式(至少据我所知);我再次陷入了困境。

然后我偶然发现了EclipseLink's JAXB-implementation: Moxy 。 Moxy 有一个 @XPath 注释,我可以将其放置在父 POJO 中,并使用它向下导航多个级别以访问单个属性,而无需创建所有这些文件夹和元素 POJO。不错。

所以我创建了这样的东西: (注意:在需要调整值的情况下,我选择使用 setter/getter )

// maps to the root-"xml" element in the file
@XmlRootElement( name="xml" )
@XmlAccessorType( XmlAccessType.FIELD )
public class Xml {

    // this is standard JAXB
    @XmlElement;               
    private Item item;
    public Item getItem() {    
        return this.item;
    }

    ...
}

// maps to the "<xml><item>"-element in the file
public class Item {

    // standard JAXB; maps to "<xml><item id="...">"
    @XmlAttribute              
    private String id;
    public String getId() {
        return this.id;
    }

    // getting an attribute buried deep down
    // MOXY; maps to "<xml><item><rating average="...">"
    @XmlPath( "rating/@average" )    
    private Double averageRating;
    public Double getAverageRating() {
        return this.average;
    }

    // getting a list buried deep down
    // MOXY; maps to "<xml><item><service><identification><aliases><alias.../><alias.../>"
    @XmlPath( "service/identification/aliases/alias/text()" )
    private List<String> aliases;
    public List<String> getAliases() {
        return this.aliases;
    }

    // using a getter to massage the value
    @XmlElement(name="dateforindex")
    private String dateForIndex;
    public Date getDateForIndex() {
        // logic to parse the string-value into a Date
    }

}

另请注意,我采取了将 XML 对象与我在应用程序中实际使用的模型对象分离的方法。因此,我有一个工厂可以将这些原始对象转换为我在应用程序中实际使用的更强大的对象。

关于java - 建议用 Java 解析此 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790641/

相关文章:

java - Akka Java : create an actor with constructor taking parameters

java - 什么时候以及为什么我必须选择 Spring Boot?

java - 从 C 调用 MATLAB

android - 是否可以在 Android 运行时交换 XML 布局?

xml - XSL For-Each 循环

xslt - 为元素的每个值的第一个和最后一次出现生成上下文数据

mysql - 在 MySQL 中解析 XML 字符串

Java split() 方法最后去除空字符串?

c# - XML全文件读取C#

android - 带有和不带有 "+"的 Android 布局 XML 中的 ID