【问题标题】:derive from foreign xml schema从外部 xml 模式派生
【发布时间】:2014-08-16 15:09:38
【问题描述】:

这是一个 xml 示例,我希望能够使用我的自制架构进行验证。 整个EncryptedData 部分实际上是 XML 加密规范的语法。

<?xml version="1.0" encoding="UTF-8"?>
<Foo xmlns="http://www.foo.org/FOO">
    <EncryptedData>
        <EncryptionMethod
            Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
        <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            <ds:KeyName>John Smith</ds:KeyName>
        </ds:KeyInfo>
        <CipherData>
            <CipherValue>DEADBEEF</CipherValue>
        </CipherData>
    </EncryptedData>
</Foo>

所以我尝试从 XML 加密派生并想出了这个:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xenc='http://www.w3.org/2001/04/xmlenc#'
    xmlns:xenc11="http://www.w3.org/2009/xmlenc11#"
    xmlns:foo="http://www.foo.org/Foo"
    targetNamespace="http://www.foo.org/Foo">
    <xsd:import namespace='http://www.w3.org/2001/04/xmlenc#' />
    <xsd:import namespace='http://www.w3.org/2009/xmlenc11#' />
    <xsd:element name="Foo">
        <xsd:complexType>
            <xsd:choice>
                <xsd:element name="myItem" minOccurs="1" maxOccurs="unbounded" type="anyType"/>
                <xsd:element ref="xenc:EncryptedData" minOccurs="1"
                    maxOccurs="unbounded" />
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

但是我的实际 xml 必须看起来像这样。我需要在导入所有 XML 加密元素时为其添加名称空间。

<?xml version="1.0" encoding="UTF-8"?>
<foo
    xmlns="http://www.foo.org/Foo"
    xmlns:xenc='http://www.w3.org/2001/04/xmlenc#'/>
    <xenc:EncryptedData>
        <xenc:EncryptionMethod
            Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
        <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            <ds:KeyName>John Smith</ds:KeyName>
        </ds:KeyInfo>
        <xenc:CipherData>
            <xenc:CipherValue>DEADBEEF</xenc:CipherValue>
        </xenc:CipherData>
    </xenc:EncryptedData>
</foo>

但由于目标命名空间不同,我也没有真正将导入更改为包含。 (我自己与 xml 加密模式中定义的不同) 有没有办法做到这一点,所以你甚至可以在没有命名空间的情况下使用它? 还是只能使用前缀?

【问题讨论】:

    标签: xml import xsd include xml-encryption


    【解决方案1】:

    您可以在根元素中更改默认命名空间

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Created with Liquid XML 2014 Developer Bundle Edition 12.1.2.5004 (http://www.liquid-technologies.com) -->
    <fns:foo xmlns:fns="http://www.foo.org/Foo"
             xmlns='http://www.w3.org/2001/04/xmlenc#'>
        <EncryptedData>
            <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
            <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:KeyName>John Smith</ds:KeyName>
            </ds:KeyInfo>
            <CipherData>
                <CipherValue>DEADBEEF</CipherValue>
            </CipherData>
        </EncryptedData>
    </fns:foo>
    

    或者您可以多次更改默认元素,删除所有前缀

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Created with Liquid XML 2014 Developer Bundle Edition 12.1.2.5004 (http://www.liquid-technologies.com) -->
    <foo xmlns="http://www.foo.org/Foo">
        <EncryptedData xmlns='http://www.w3.org/2001/04/xmlenc#'>
            <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
            <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                <KeyName>John Smith</KeyName>
            </KeyInfo>
            <CipherData>
                <CipherValue>DEADBEEF</CipherValue>
            </CipherData>
        </EncryptedData>
    </foo>
    

    【讨论】:

    • 我选择了第二个选项,它至少适用于 XML 加密。不幸的是,在使用我自己的模式尝试此操作时,我得到“匹配的通配符是严格的,但找不到元素的声明”。无论如何,它似乎工作!谢谢
    • 我得到的错误是因为eclipse在xml目录中设置了错误的命名空间。
    猜你喜欢
    • 2023-03-11
    • 2023-03-15
    • 2012-06-02
    • 1970-01-01
    • 2018-06-30
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多