如何使用xercesc :: SAX2XMLReader检索xsi:schemaLocation

时间:2014-07-20 14:58:24

标签: c++ xml xsd xerces-c

我使用SAX2XMLReader来解析XML文件,该文件通过在其根元素中包含属性xsi:schemaLocation来指定XSD架构。

如何检索此属性的字符串值?

我试过

parser->getProperty(XMLUni::fgXercesSchemaExternalSchemaLocation)

但它会返回nullptr

1 个答案:

答案 0 :(得分:0)

您可以创建一个继承自PSVIHandler的MyPSVIHandler类,并使用setPSVIHandler方法安装它。

MyPSVIHandler psvi_handler;
sax2xmlreader->setPSVIHandler(&psvi_handler);
void MyPSVIHandler::handleAttributesPSVI(
    const XMLCh *const /* localName */,
    const XMLCh *const /* uri */,
    PSVIAttributeList *psviAttributes) {
  for (XMLSize_t i = 0; i < psviAttributes->getLength(); i++) {
    if (XMLString::equals(psviAttributes->getAttributeNamespaceAtIndex(i),
                          SchemaSymbols::fgURI_XSI)) {
      const XMLCh *attr_name(psviAttributes->getAttributeNameAtIndex(i));
      if (XMLString::equals(attr_name, SchemaSymbols::fgXSI_SCHEMALOCATION)) {
        const XMLCh *str = psviAttributes->
            getAttributePSVIAtIndex(i)->getSchemaNormalizedValue();
        char *transcoded_str = xercesc::XMLString::transcode(str);
        std::cout << "schemaLocation = " << transcoded_str << "\n";
        xercesc::XMLString::release(&transcoded_str);
      }
    }
  }
}