为不同的 xml 子标签生成 xsd 和 Java 类 - JAXB

Generating xsd and Java classes for varying xml child tag - JAXB

我想知道我们是否可以为不同的子 xml 标签生成 xsd 和相应的 java 类。我对 xml 解析还很陌生。

案例:1

<?xml version="1.0"?>
<SSNExportDocument xmlns="urn:com:ssn:schema:export:SSNExportFormat.xsd" Version="0.1" DocumentID="8b6fdfce-9f5f-4110-b6da-c5650f0851c2-1" ExportID="8b6fdfce-9f5f-4110-b6da-c5650f0851c2" JobID="464" RunID="3726980" CreationTime="2019-06-01T20:20:00.417-04:00" StartTime="2019-06-01T14:20:00.000-04:00" EndTime="2019-06-01T20:20:00.000-04:00">
    <MeterData MeterName="CBRE-11459398" UtilDeviceID="11459398" MacID="anonymized">
        <RegisterData StartTime="2019-06-01T14:00:00.000-04:00" EndTime="2019-06-01T14:00:00.000-04:00" NumberReads="1">
            <RegisterRead ReadTime="2019-06-01T14:00:00.000-04:00" GatewayCollectedTime="2019-06-01T19:40:03.116-04:00" RegisterReadSource="REG_SRC_TYPE_EO_CURR_READ" Season="-1">
                <Tier Number="0">
                    <Register Number="1" Summation="9981.2000" SummationUOM="GAL"/>
                </Tier>
            </RegisterRead>
        </RegisterData>
    </MeterData>
    <MeterData MeterName="CBRE-11460365" UtilDeviceID="11460365" MacID="anonymized">
        <RegisterData StartTime="2019-06-01T14:00:00.000-04:00" EndTime="2019-06-01T14:00:00.000-04:00" NumberReads="1">
            <RegisterRead ReadTime="2019-06-01T14:00:00.000-04:00" GatewayCollectedTime="2019-06-01T19:40:03.113-04:00" RegisterReadSource="REG_SRC_TYPE_EO_CURR_READ" Season="-1">
                <Tier Number="0">
                    <Register Number="1" Summation="142104.1000" SummationUOM="GAL"/>
                </Tier>
            </RegisterRead>
        </RegisterData>
    </MeterData>
</SSNExportDocument>

案例:2

<?xml version="1.0"?>
<SSNExportDocument xmlns="urn:com:ssn:schema:export:SSNExportFormat.xsd" Version="0.1" DocumentID="7b9d9a38-7739-4c67-9fb3-08ff1826d966-2" ExportID="7b9d9a38-7739-4c67-9fb3-08ff1826d966" JobID="465" RunID="2983700" CreationTime="
:2018-12-19T20:20:01.218-05:00" StartTime="2018-12-19T14:20:00.000-05:00" EndTime="2018-12-19T20:20:00.000-05:00">
        <MeterData MeterName="CBRE-11460650" UtilDeviceID="11460650" MacID="00:11:01:ff:fe:00:db:ff">
                <IntervalReadData IntervalLength="60" StartTime="2018-12-19T07:00:00.000-05:00" EndTime="2018-12-19T19:00:00.000-05:00" NumberIntervals="12">
                        <Interval EndTime="2018-12-19T08:00:00.000-05:00" GatewayCollectedTime="2018-12-19T19:40:03.052-05:00" BlockSequenceNumber="0" IntervalSequenceNumber="6636688262981226347">
                                <Reading Channel="1" RawValue="0.0" Value="0" UOM="GAL" BlockEndValue="78582.3000"/>
                        </Interval>
                        <Interval EndTime="2018-12-19T09:00:00.000-05:00" GatewayCollectedTime="2018-12-19T19:40:03.052-05:00" BlockSequenceNumber="0" IntervalSequenceNumber="6636703724863491951">
                                <Reading Channel="1" RawValue="0.0" Value="0" UOM="GAL" BlockEndValue="78582.3000"/>
                        </Interval>
              </IntervalReadData
        </MeterData>
</SSNExportDocument>

在上述情况下,您可以看到 MeterData 标签的内容不同,但 MeterData 标签保持不变。

XML 文档通常被描述为 "semi-structured",但实际上,它们在 highly-structured 到 highly-unstructured 的范围内。像 Java 这样的传统编程语言最擅长处理 highly-structured 数据,因此,像 JAXB 这样的数据绑定技术在这方面表现最好。您移动到 ​​highly-unstructured 的次数越多(例如 HTML),JAXB 变得越困难;在范围的那一端,您应该使用像 DOM、XOM 或 JDOM 这样的通用树模型,或者像 XSLT 和 XQuery 这样的专业 XML 处理语言。您展示的示例处于范围的中间,您开始离开 JAXB comfort-zone,但它仍然几乎可行。

这里还有另一个维度,即结构随时间的稳定性。架构更改得越频繁,您越会离开 JAXB 的舒适区。