草庐IT

java - 生成漂亮的 JAXB 类

coder 2024-06-30 原文

我过去曾使用 JAXB 进行 XML 解析,并为其创建了自己的简单类。那些是 POJO,比如

public class Foo {

    @XmlAttribute
    public String someAttribute;

    public String someElement;

    public Bar bar;
}

现在我想编写一个工具来解析来自非常复杂的 xml 结构的数据,我想避免自己编写所有这些。我尝试使用 xjc 生成类,但它们看起来与我上面的示例完全不同:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "RulesElementType", propOrder = { "content" })
public class RulesElementType {

    @XmlElementRefs({ @XmlElementRef(name = "flavor2", type = JAXBElement.class, required = false),
            @XmlElementRef(name = "specific", type = JAXBElement.class, required = false),
            @XmlElementRef(name = "category2", type = JAXBElement.class, required = false),
            @XmlElementRef(name = "flavor1", type = JAXBElement.class, required = false),
            @XmlElementRef(name = "print-prereqs", type = JAXBElement.class, required = false),
            @XmlElementRef(name = "prereqs2", type = JAXBElement.class, required = false),
            @XmlElementRef(name = "rules", type = JAXBElement.class, required = false),
            @XmlElementRef(name = "prereqs1", type = JAXBElement.class, required = false) })
    @XmlMixed
    protected List<Serializable> content;
    @XmlAttribute(name = "name")
    protected String name;
    @XmlAttribute(name = "type1")
    protected String type1;
    @XmlAttribute(name = "internal-id")
    protected String internalId;
    @XmlAttribute(name = "source")
    protected String source;
    @XmlAttribute(name = "revision-date")
    protected String revisionDate;

    /* getters and setters omitted */

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = { "value" })
    public static class Category2 {

        @XmlValue
        protected String value;
        @XmlAttribute(name = "name")
        protected String name;

        /* getters and setters omitted */

    }

    /* additional class definitions omitted */

}

要获得名为“flavor1”的元素,我必须在“content”属性中搜索名为“flavor1”的 JAXBElement,我发现这非常不方便。我希望能够做的是:

String flavor1 = rulesElement.getFlavor1();

有没有办法使用 xjc 或其他工具来完成此操作?

编辑: 来 self 的 xsd 的 RulesElementType 的复杂类型是:

  <xs:complexType name="RulesElementType" mixed="true">
    <xs:choice maxOccurs="unbounded" minOccurs="0">
      <xs:element name="category2">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute type="xs:string" name="name" use="optional"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element name="prereqs2">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute type="xs:string" name="name" use="optional"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element type="xs:string" name="print-prereqs"/>
      <xs:element name="flavor2">
        <xs:complexType mixed="true">
          <xs:choice maxOccurs="unbounded" minOccurs="0">
            <xs:element type="grantType" name="grant"/>
            <xs:element type="stataddType" name="statadd"/>
            <xs:element type="textstringType" name="textstring"/>
            <xs:element type="selectType" name="select"/>
            <xs:element type="replaceType" name="replace"/>
            <xs:element type="modifyType" name="modify"/>
            <xs:element type="dropType" name="drop"/>
            <xs:element type="suggestType" name="suggest"/>
            <xs:element type="stataliasType" name="statalias"/>
          </xs:choice>
          <xs:attribute type="xs:string" name="name" use="optional"/>
        </xs:complexType>
      </xs:element>
      <xs:element type="specificType" name="specific"/>
      <xs:element type="rulesType" name="rules"/>
      <xs:element type="xs:string" name="prereqs1"/>
      <xs:element name="flavor1">
        <xs:complexType mixed="true">
          <xs:choice maxOccurs="unbounded" minOccurs="0">
            <xs:element type="grantType" name="grant"/>
            <xs:element type="stataddType" name="statadd"/>
            <xs:element type="textstringType" name="textstring"/>
            <xs:element type="selectType" name="select"/>
            <xs:element type="replaceType" name="replace"/>
            <xs:element type="modifyType" name="modify"/>
            <xs:element type="dropType" name="drop"/>
            <xs:element type="suggestType" name="suggest"/>
            <xs:element type="stataliasType" name="statalias"/>
          </xs:choice>
          <xs:attribute type="xs:string" name="name" use="optional"/>
        </xs:complexType>
      </xs:element>
    </xs:choice>
    <xs:attribute type="xs:string" name="name" use="optional"/>
    <xs:attribute type="xs:string" name="type1" use="optional"/>
    <xs:attribute type="xs:string" name="internal-id" use="optional"/>
    <xs:attribute type="xs:string" name="source" use="optional"/>
    <xs:attribute type="xs:string" name="revision-date" use="optional"/>
  </xs:complexType>

XML 文件看起来有点类似于 this .

我使用 XMLBeans 生成 xsd。由于我正在读取的 XML 文件有大约 680k 行,手动创建 XSD 不是一个选项。

最佳答案

您可以使用 Simplify plugin简化您的 content 属性。

SO 免责声明:我是作者。

请看这个问题:

Generate java classes from xsd with jaxb from a choice

extracting element text value

简而言之,如果您使用此插件并使用 simplify:as-element-property 自定义进入您的 content 属性的元素之一,您可以得到不同的每个元素易于使用元素属性。我希望这就是您所说的“漂亮”。

关于java - 生成漂亮的 JAXB 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26158956/

有关java - 生成漂亮的 JAXB 类的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  3. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  10. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

随机推荐