Java 如何生成一个类,从中可以将节点的XML作为字符串检索

Java 如何生成一个类,从中可以将节点的XML作为字符串检索,java,xsd,jaxb,xjc,maven-jaxb2-plugin,Java,Xsd,Jaxb,Xjc,Maven Jaxb2 Plugin,下面是从ApacheMaven中提取的配置元素的描述 我使用以下绑定文件从上述xsd生成类: <jxb:bindings version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:extensionBindingPrefixes="xjc" xmlns:xjc="http://java.sun.com/xml/ns/jaxb

下面是从ApacheMaven中提取的
配置
元素的描述

我使用以下绑定文件从上述xsd生成类:

<jxb:bindings version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
  jxb:extensionBindingPrefixes="xjc" 
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">

  <jxb:globalBindings>
    <!-- use plural method names for repeatable elements -->
    <xjc:simple />
  </jxb:globalBindings>

  <jxb:bindings schemaLocation="maven-4.0.0.xsd">
    <!-- rename all the node of type "any" to "elements" to improve readability -->
    <jxb:bindings multiple="true" node="//xs:any" >
      <jxb:property name="elements"/>
    </jxb:bindings>
  </jxb:bindings>
</jxb:bindings>
解析此XML文件并将其加载到生成的模型后,我希望能够在
配置
实例上调用
getXML()
方法并获得:

<configuration>
  <source>${build.jdk.source.version}</source>
    <target>${build.jdk.target.version}</target>
  <encoding>${project.build.sourceEncoding}</encoding>
        <fork>true</fork>
</configuration>

${build.jdk.source.version}
${build.jdk.target.version}
${project.build.sourceEncoding}
真的
(按原样保留错误的缩进)

我在考虑下面的方法

  • 在绑定文件中检测我正在处理“配置”节点(如何?)
  • 使
    Configuration
    类扩展一个
    XmlHolder
    类,该类能够将XML作为字符串保存(使用
    getDom()
    setXml(string)
    方法)
  • 使用
    XmlHolderAdapter
    适配器类将XML块提取为字符串,并将其设置在
    Configuration
    类上
  • 我的问题是:

    • 方法正确吗
    • 有更好的方法吗
    • 我如何修改绑定文件,以及适配器类的内容应该是什么来实现这一点(如果我没有错,我会得到一个
      XMLStreamReader
      作为源)

    提前多谢了,

    我在过去的搜索中也回答了类似的问题,并需要在运行时类的相关XSD部分。我最终为此写了一封信

    一般如何使用它,您可以在该答案中看到:

    我还为你们准备了一个例子和测试。请查看示例
    gradle
    项目

    要完全理解,请逐步进行:

  • gradle
    中,我使用调用
    XJC
    (您可以使用类似的
    maven
    插件或直接调用它):
  • 我还将生成的类添加到源路径:
  • 然后生成源:
  • 您的类将位于带有注释的目录
    src/main/generated java
    。对于您的情况,最感兴趣的是它的元素

  • 在运行时,您可以只查询它并根据需要使用(
    插件
    类包含
    配置
    作为内部类):

  • 我准备测试来充分演示它。

    我也在过去的搜索中回答了类似的问题,并且在运行时需要类的相关XSD部分。我最终为此写了一封信

    一般如何使用它,您可以在该答案中看到:

    我还为你们准备了一个例子和测试。请查看示例
    gradle
    项目

    要完全理解,请逐步进行:

  • gradle
    中,我使用调用
    XJC
    (您可以使用类似的
    maven
    插件或直接调用它):
  • 我还将生成的类添加到源路径:
  • 然后生成源:
  • 您的类将位于带有注释的目录
    src/main/generated java
    。对于您的情况,最感兴趣的是它的元素

  • 在运行时,您可以只查询它并根据需要使用(
    插件
    类包含
    配置
    作为内部类):
  • 我准备测试以充分证明它

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>test</groupId>
      <artifactId>test</artifactId>
      <version>1.0.1-SNAPSHOT</version>
      <build>
        <pluginManagement>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>${plugin.maven-compiler-plugin.version}</version>
              <configuration>
                <source>${build.jdk.source.version}</source>
                  <target>${build.jdk.target.version}</target>
                <encoding>${project.build.sourceEncoding}</encoding>
                      <fork>true</fork>
              </configuration>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>
    
    <configuration>
      <source>${build.jdk.source.version}</source>
        <target>${build.jdk.target.version}</target>
      <encoding>${project.build.sourceEncoding}</encoding>
            <fork>true</fork>
    </configuration>
    
    plugins {
        id 'java'
        id 'org.unbroken-dome.xjc' version '1.4.1' // https://github.com/unbroken-dome/gradle-xjc-plugin
    }
    
    dependencies {
        xjcClasspath 'info.hubbitus:xjc-documentation-annotation-plugin:1.0'
        ...
    }
    // Results by default in `build/xjc/generated-sources`
    xjcGenerate {
        /**
         * There:
         * 1. CadastralBlock.xsd is minimal example of functional.
         * 2. maven-4.0.0.xsd - example by SOq https://stackoverflow.com/questions/42223784/how-can-i-generate-a-class-from-which-i-can-retrieve-the-xml-of-a-node-as-a-stri
         */
        source = fileTree('src/main/resources') { include '*.xsd' }
        bindingFiles = fileTree('src/main/jaxb') { include '*.xjb' }
        outputDirectory = file('src/main/generated-java')
        packageLevelAnnotations = false
        targetPackage = 'info.hubbitus.xjc.plugin.example'
        extraArgs = [ '-XPluginDescriptionAnnotation' ]
    }
    
    sourceSets.main.java.srcDir new File(buildDir, xjcGenerate.outputDirectory.absolutePath)
    // If you use IntellyJ Idea:
    idea {
        module {
            // Marks the already(!) added srcDir as "generated"
            generatedSourceDirs += xjcGenerate.outputDirectory
        }
    }
    
    ./gradlew xjcGenerate
    
        XsdInfo xsdAnnotation = plugin.getClass().getDeclaredAnnotation(XsdInfo.class);
        System.out.println(xsdAnnotation.xsdElementPart());