如何在XML模式中访问枚举ID(使用xerces-c)?

时间:2013-04-03 15:40:37

标签: xsd xerces-c

假设我有一个可能包含以下内容的XSD:

<simpleType name="CELESTIAL_IMPORIUM_CATEGORY">
    <restriction base="integer">
        <enumeration id="BELONGING_TO_THE_EMPEROR" value="8001"/>
        <enumeration id="EMBALMED"                 value="8002"/>
        <enumeration id="TRAINED"                  value="8003"/>
        <enumeration id="SUCKLING_PIGS"            value="8004"/>
    </restriction>
</simpleType>

假设我希望能够获取枚举值及其名称(在id属性中)。我想知道这是否可能。

假设更进一步,我可能正在使用xerces-c(3.1.1,比如说),更具体地说,是使用来自xercesc / framework / psvi的类。我有一个初步的捅,事情看起来并不乐观:

  • 看起来XSSimpleTypeDefinition可以通过getMultiValueFacets()
  • 访问枚举详细信息
  • 但是,这会返回XSMultiValueFacet,这似乎只提供对值(和注释)的访问。

或许,有些东西我不知道了吗?

3 个答案:

答案 0 :(得分:1)

Genericode是一个很好的例子,说明如何以一种在XSD中仍然有效的方式包含代码,ID和描述。 https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=codelist

以下是完整列表的快速示例:here

 <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ccts="urn:un:unece:uncefact:documentation:2" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:simpleType name="CurrencyCodeContentType">
    <xs:restriction base="xs:token"><xs:enumeration value="AED"><xs:annotation><xs:documentation>
                        <ccts:CodeName>Dirham</ccts:CodeName>
                        <ccts:CodeDescription/>
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration><xs:enumeration value="AFN"><xs:annotation><xs:documentation>
                        <ccts:CodeName>Afghani</ccts:CodeName>
                        <ccts:CodeDescription/>
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration><xs:enumeration value="ALL"><xs:annotation><xs:documentation>
                        <ccts:CodeName>Lek</ccts:CodeName>
                        <ccts:CodeDescription/>
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration><xs:enumeration value="AMD"><xs:annotation><xs:documentation>
                        <ccts:CodeName>Dram</ccts:CodeName>
                        <ccts:CodeDescription/>
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration><xs:enumeration value="ANG"><xs:annotation><xs:documentation>
                        <ccts:CodeName>Netherlands Antillian Guilder</ccts:CodeName>
                        <ccts:CodeDescription/>
                    </xs:documentation>
                </xs:annotation>
            </xs:enumeration>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

答案 1 :(得分:0)

我认为你没有遗漏任何东西(但我不熟悉Xerces-C的内部)。 XSD规范详细定义了模式后验证信息集和模式组件的抽象结构,但它并不要求验证器提供对任何一个特定部分的访问,更不用说为此指定API。 (在关键时刻,来自一家有影响力的公司的工作组成员咆哮着“我们不需要没有steenking API规范”,并且几乎房间里的所有供应商都同意了。)所以你可以访问的是由特定的软件决定的您正在使用,您可以通过它访问它。

然而,即使是最全面的API也不太可能提供对xsd:enumeration元素上ID属性值的访问--ID属性不对应于简单类型组件的任何部分,几乎所有设计者用于模式信息的API可能会将其视为组件的XML表示的附带工件,而没有任何内在的兴趣。

如果您可以访问定义您正在使用的架构的架构文档,当然,您始终只需使用普通的XML工具来查找您感兴趣的ID;这是使架构文档首先成为XML文档的原因之一。

答案 2 :(得分:0)

它对我使用

的枚举有效
std::vector<std::basic_string<XMLCh>> values;
if (type->getTypeCategory() == xercesc_3_2::XSTypeDefinition::SIMPLE_TYPE) {
    const auto simpleType = static_cast<xercesc_3_2::XSSimpleTypeDefinition *>(type);
    const auto multiValueFacets = simpleType->getMultiValueFacets();
    for (auto i = 0; multiValueFacets && i < multiValueFacets->size(); i++) {
        const auto el = multiValueFacets->elementAt(i);
        const auto facets = el->getLexicalFacetValues();
        for (auto vi = 0; facets && vi < facets->size(); vi++) {
            values.emplace_back(facets->elementAt(vi));
        }
    }
}