使用正则表达式验证属性名称?

时间:2015-01-09 14:02:09

标签: regex xml xsd

我想知道是否可以使用XML Schema按模式验证属性名称。换句话说,我想使用模式(例如正则表达式)描述给定类型的一组可接受的属性名称。

假设我有以下要验证的XML数据:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://mywebsite.com/myns">
  <somename data-someattr1="value1" 
            data-someattr2="value2"/>
</root>

如何描述名称为“somename”的元素的属性只能包含名称以“data - ”开头的属性? 这可能吗?

2 个答案:

答案 0 :(得分:3)

尝试以下方面的内容:

<xs:simpleType name="somename">
    <xs:restriction base="xs:string">
        <xs:pattern value="^data-"/>
    </xs:restriction>
</xs:simpleType>

正则表达式^data-表示“以'data-'开头”,视需要而定。

修改

我误解了这个问题,对不起......这是一个更相关的答案:

据我了解,您无法在XSD中模式匹配属性名称 - 因此单独使用XSD无法解决您的问题。但是,您可能会发现以下XML架构元素之一有助于构建解决方案:

答案 1 :(得分:1)

好吧,因为据说你无法验证属性名称,但你仍然可以采用不同的方式将xml转换为某种形式:

<root>
    <element>
        <data name='data-attr1' value='v1'/>
        <data name='data-attr2' value='v2'/>
        <data name='data-attr3' value='v3'/>
    </element>
</root>

现在您可以验证属性名称 - data name='data-attr1'以及值。您的架构可能如下所示:

<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault='qualified' attributeFormDefault='unqualified'>
    <xs:element name='root'>
        <xs:complexType>            
            <xs:sequence>
                <xs:element name='element'>
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element maxOccurs='10' name='data'>
                                <xs:complexType>
                                    <xs:attribute name='name' use='required'>
                                        <xs:simpleType>
                                            <xs:restriction base='xs:string'>
                                                <xs:pattern value='data-.*' />
                                            </xs:restriction>
                                        </xs:simpleType>
                                    </xs:attribute>
                                    <xs:attribute name='value' use='required' />
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>