Java 根据XSD验证XML,并使用验证结果丰富内容

Java 根据XSD验证XML,并使用验证结果丰富内容,java,xml,validation,xsd,Java,Xml,Validation,Xsd,我正在构建一个java工具来验证xml文档,并构建一个包含输入数据和验证结果的html报告。 我认为一种可能的方法是: 使用XSD验证XML 使用验证结果丰富XML 在最终的HTML报告中转换丰富的XML(这一点不是问题的目标) 首先,这是一种有效的方法吗?还是有更合适的方法用java完成这些事情 如果这是一个可行的解决方案,我如何实施步骤2 例如,如果我从这个输入文档开始: <parent> <child id="a correct id" type="a corre

我正在构建一个java工具来验证xml文档,并构建一个包含输入数据和验证结果的html报告。 我认为一种可能的方法是:

  • 使用XSD验证XML
  • 使用验证结果丰富XML
  • 在最终的HTML报告中转换丰富的XML(这一点不是问题的目标)
  • 首先,这是一种有效的方法吗?还是有更合适的方法用java完成这些事情

    如果这是一个可行的解决方案,我如何实施步骤2

    例如,如果我从这个输入文档开始:

    <parent>
        <child id="a correct id" type="a correct type"/>
        <child id="an incorrect id" type="an incorrect type"/>
    </parent>
    
    
    
    如何生成这样一个丰富的输出文档:

    <parent>
    
        <child id="a correct id" type="a correct type">
            <results>
                <result>id is correct</result>
                <result>type is correct</result>
            </results>
        </child>
    
        <child id="an incorrect id" type="an incorrect type">
            <results>
                <result>id is NOT correct</result>
                <result>type is NOT correct</result>
            </results>
        </child>
    
    </parent>
    
    
    身份证是正确的
    类型是正确的
    身份证不正确
    类型不正确
    
    首先,有很多方法可以做到这一点。还有其他类似的工具提供了描述验证结果的语言,以及将验证结果转换为漂亮HTML的能力。有许多java包实际上执行模式验证,所以您要完成的大部分工作应该是“粘合代码”。确保不要尝试在java代码中进行模式验证

    所以接下来,我不确定您希望在验证后转换原始XML文件的要求是什么。通常,您会将验证结果集转储为单独的文件。原始XML的模式是否允许您添加内容

    通常,如果您想转换原始输入,可以编写一个XSLT程序,获取验证结果文件和原始源文件,然后使用这些验证结果转换原始文件。但我不建议这样做,因为我认为您的情况可能需要一种不转换原始文件的不同设计,除非您有更多的要求,您想深入了解

    另一种选择是直接的DOM操作。在验证之后,您可以对其进行操作,然后将其写回相同的原始文件


    但是说真的——在你为第二步采取任何方法之前,确保你的需求真的需要它。

    首先,有很多方法可以做到这一点。还有其他类似的工具提供了描述验证结果的语言,以及将验证结果转换为漂亮HTML的能力。有许多java包实际上执行模式验证,所以您要完成的大部分工作应该是“粘合代码”。确保不要尝试在java代码中进行模式验证

    所以接下来,我不确定您希望在验证后转换原始XML文件的要求是什么。通常,您会将验证结果集转储为单独的文件。原始XML的模式是否允许您添加内容

    通常,如果您想转换原始输入,可以编写一个XSLT程序,获取验证结果文件和原始源文件,然后使用这些验证结果转换原始文件。但我不建议这样做,因为我认为您的情况可能需要一种不转换原始文件的不同设计,除非您有更多的要求,您想深入了解

    另一种选择是直接的DOM操作。在验证之后,您可以对其进行操作,然后将其写回相同的原始文件


    但是说真的——在你为第二步采取任何方法之前,确保你的需求真的需要它。

    首先,有很多方法可以做到这一点。还有其他类似的工具提供了描述验证结果的语言,以及将验证结果转换为漂亮HTML的能力。有许多java包实际上执行模式验证,所以您要完成的大部分工作应该是“粘合代码”。确保不要尝试在java代码中进行模式验证

    所以接下来,我不确定您希望在验证后转换原始XML文件的要求是什么。通常,您会将验证结果集转储为单独的文件。原始XML的模式是否允许您添加内容

    通常,如果您想转换原始输入,可以编写一个XSLT程序,获取验证结果文件和原始源文件,然后使用这些验证结果转换原始文件。但我不建议这样做,因为我认为您的情况可能需要一种不转换原始文件的不同设计,除非您有更多的要求,您想深入了解

    另一种选择是直接的DOM操作。在验证之后,您可以对其进行操作,然后将其写回相同的原始文件


    但是说真的——在你为第二步采取任何方法之前,确保你的需求真的需要它。

    首先,有很多方法可以做到这一点。还有其他类似的工具提供了描述验证结果的语言,以及将验证结果转换为漂亮HTML的能力。有许多java包实际上执行模式验证,所以您要完成的大部分工作应该是“粘合代码”。确保不要尝试在java代码中进行模式验证

    所以接下来,我不确定您希望在验证后转换原始XML文件的要求是什么。通常,您会将验证结果集转储为单独的文件。原始XML的模式是否允许您添加内容

    通常,如果要转换原始输入,
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="parent">
    
        <xsl:for-each select="child">
            <xsl:call-template name="processChildren"/>
        </xsl:for-each>
    
    </xsl:template>
    
    <!-- this template processes the children nodes, applying a sample test clause  -->
    <xsl:template name="processChildren">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    
        <results>
        <xsl:choose>
            <xsl:when test="contains(@id,'incorrect')">
                <result>id is NOT correct</result>
            </xsl:when>
            <xsl:otherwise>
                <result>id is correct</result>
            </xsl:otherwise>
        </xsl:choose>
    
        <xsl:choose>
            <xsl:when test="contains(@type,'incorrect')">
                <result>type is NOT correct</result>
            </xsl:when>
            <xsl:otherwise>
                <result>type is correct</result>
            </xsl:otherwise>
        </xsl:choose>
        </results>
    
         </xsl:copy>
    </xsl:template>
    
    <!-- this template copy the contents of the node unaltered -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
        </xsl:template>
    
    </xsl:stylesheet>