假设我有一个可能包含以下内容的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
,它似乎只提供对值(和注释)的访问。或许,是否有我遗失的东西?
我不认为你有任何遗漏(但我不熟悉Xerces-C内部)。 XSD规范详细定义了模式后验证信息集和模式组件的抽象结构,但它并不要求验证器提供对任何一个特定部分的访问,更不用说为此指定API。 (在关键时刻,来自一家有影响力的公司的工作组成员咆哮着“我们不需要没有steenking API规范”,并且几乎房间里的所有供应商都同意了。)所以你可以访问的是由特定的软件决定的您正在使用,您可以通过它访问它。
然而,即使是最彻底的API也不太可能提供对xsd:enumeration元素上ID属性值的访问--ID属性不对应于简单类型组件的任何部分,而且几乎所有API的设计者都对应模式信息可能会将其视为组件的XML表示的附带工件,而没有任何内在的兴趣。
如果您可以访问定义您正在使用的模式的模式文档,当然,您始终可以使用普通的XML工具来查找您感兴趣的ID;这是使架构文档首先成为XML文档的原因之一。
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>
它对我来说对于<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));
}
}
}