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

问题描述 投票:3回答:3

假设我有一个可能包含以下内容的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,它似乎只提供对值(和注释)的访问。

或许,是否有我遗失的东西?

xsd xerces-c
3个回答
0
投票

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

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

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


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>

0
投票

它对我来说对于<xsd:restriction base =“xsd:string”>的枚举:

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));
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.