Java XSD-验证该元素是否引用XML文件中的其他元素

Java XSD-验证该元素是否引用XML文件中的其他元素,java,xml,xsd,Java,Xml,Xsd,我有一个简单的XML文件: <TestBuilder> <TestBox testValue="x">test1,test2,test2</TestBox> <Test id="test1" /> <Test2 id="test2" /> <SomethingElse id="test3" /> </TestBuilder> 你知道这是否可能吗?以及如何使用通用解决方案解决问题

我有一个简单的XML文件:

<TestBuilder>
    <TestBox testValue="x">test1,test2,test2</TestBox>

    <Test id="test1" />
    <Test2 id="test2" />
    <SomethingElse id="test3" />
</TestBuilder>

你知道这是否可能吗?以及如何使用通用解决方案解决问题?

XML模式支持列表,但只支持空格分隔的列表,而不支持逗号分隔的列表(另外,请注意,由于TestBox的结束标记中缺少
/
,文档的格式不正确)。也就是说,如果您可以对文档进行预处理以使用空格而不是逗号,您所要求的应该是可能的:

<TestBuilder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="test.xsd">
    <TestBox testValue="x">test1 test2 test2</TestBox>

    <Test id="test1" />
    <Test2 id="test2" />
    <SomethingElse id="test3" />
</TestBuilder>

XML模式确实支持列表,但只支持空格分隔的列表,而不支持逗号分隔的列表(另外,请注意,由于TestBox的结束标记中缺少
/
,文档的格式不正确)。也就是说,如果您可以对文档进行预处理以使用空格而不是逗号,您所要求的应该是可能的:

<TestBuilder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="test.xsd">
    <TestBox testValue="x">test1 test2 test2</TestBox>

    <Test id="test1" />
    <Test2 id="test2" />
    <SomethingElse id="test3" />
</TestBuilder>

我希望您能从“非常”旧的系统中获得此XML。否则,xml中的csv是反模式最糟糕的情况之一。如果您是从头开始创建系统,“不要”在其中包含此“技术”。它来自非常旧的系统,更改此XML模式将对系统产生巨大影响。。。我不能改变它。我不知道如何直接做到这一点,但也许有人会提出解决方案。如果是我,我会按照以下思路做一些事情:1。将xml读入字符串。2.找到一个
TestBox
标记并手动转换,在开头添加
,在结尾添加
,并用
替换每个逗号。3.解析生成的XML文档。由于转换只发生在内存中,因此您不必更改整个系统,但您可以保持头脑清醒。在我看来,使用XSD强制执行高于“结构需求”的业务规则是一个糟糕的技术选择,这一点并不被普遍接受。业务规则有一种演变的方式/习惯,即“除非发生”、“仅当发生”、“不在发生”异常,这些异常很快就从XSD和regexps购买的内容中衍生出来。您可能最终会发现XSD很好地满足了一些需求,有些需求会被质疑的解决方法所束缚,还有一些需求根本不起作用。我从一开始就用我自己的方式实现业务控制。你能使用Schematron或任何通用编程语言来执行这些规则吗?我希望你能从一个“非常”旧的系统中得到这个XML。否则,xml中的csv是反模式最糟糕的情况之一。如果您是从头开始创建系统,“不要”在其中包含此“技术”。它来自非常旧的系统,更改此XML模式将对系统产生巨大影响。。。我不能改变它。我不知道如何直接做到这一点,但也许有人会提出解决方案。如果是我,我会按照以下思路做一些事情:1。将xml读入字符串。2.找到一个
TestBox
标记并手动转换,在开头添加
,在结尾添加
,并用
替换每个逗号。3.解析生成的XML文档。由于转换只发生在内存中,因此您不必更改整个系统,但您可以保持头脑清醒。在我看来,使用XSD强制执行高于“结构需求”的业务规则是一个糟糕的技术选择,这一点并不被普遍接受。业务规则有一种演变的方式/习惯,即“除非发生”、“仅当发生”、“不在发生”异常,这些异常很快就从XSD和regexps购买的内容中衍生出来。您可能最终会发现XSD很好地满足了一些需求,有些需求会被质疑的解决方法所束缚,还有一些需求根本不起作用。我从一开始就用自己的方式实现业务控制。你能使用Schematron或任何通用编程语言来执行这些规则吗?
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="TestBuilder">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="TestBox" type="TestBoxTagType"/>
                <xs:element name="Test" type="withIDType"/>
                <xs:element name="Test2" type="withIDType"/>
                <xs:element name="SomethingElse" type="withIDType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="TestBoxTagType">
        <xs:simpleContent>
            <xs:extension base="xs:IDREFS">
                <xs:attribute name="testValue" type="xs:string" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="withIDType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="id" type="xs:ID" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:schema>