来自Java的Xerces-C XSModel端口

问题描述 投票:0回答:1

[我正在尝试使用Xerces v3.2.2移植一些Java代码,该Java代码加载一个架构文件,检索XSModel *并将其解析为一些自定义数据结构。

JAVA

import org.apache.xerces.XSLoader;
import org.apache.xerces.XSModel;

XSImplementation xsLoader = null;
XSLoader xsLoader = null;
XSModel xsModel = null;

xsImpl = (XSImplmentation) domRegistry.getDOMImplementation("XS-Loader");
xsLoader = xsImpl.createXSLoader(null);
xsModel = xsLoader.loadURI("path-to-schema.xsd");
myDataStruct = new MyDataStruct(xsModel);

我一直无法在Xerces-c文档中找到任何会产生相似结果的东西。据我所知,我可以通过XSModel*xercesc::GrammarResolver*访问xercesc::AbstractDOMParser,但这需要我从解析器中派生,因为它是受保护的函数。

CPP

#include <xercesc/parsers/XercesDOMParser.hpp>

using namespace xercesc;

class MyDOMParser : public XercesDOMParser
{
public:
    using AbstractDOMParser::getGrammarResolver;
};    

int main()
{
    XMLPlatformUtils::Initialize();

    MyDOMParser parser;
    parser.loadGrammar("path-to-schema.xsd", Grammar::GrammarType::SchemaGrammarType);
    auto resolver = parser.getGrammarResolver();
    auto xsModel = resolver->getXSModel();
    MyDataStruct myDataStruct{xsModel};
    return 0;
}

这是我必须走的路吗?这还行吗?是否有一些例子可以说明这样做的更好方法?

java c++ xml xsd xerces
1个回答
0
投票

我为CPP尝试的上述解决方案似乎确实实现了我要完成的任务。通过从XercesDOMParser派生,我可以访问GrammarResolver,因此也可以访问XSModel。该模型似乎包含我的数据结构解析所需的数据。

© www.soinside.com 2019 - 2024. All rights reserved.