来自 Java 的 Xerces-C XSModel 端口
Xerces-C XSModel port from Java
我正在尝试使用加载模式文件的 Xerces v3.2.2 移植一些 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 文档中找到任何会产生类似结果的内容。据我所知,我可以通过 xercesc::AbstractDOMParser
从 xercesc::GrammarResolver*
访问 XSModel*
但这需要我从解析器派生,因为它是一个受保护的函数。
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;
}
这是我必须走的路吗?这会起作用吗?是否有实际示例显示更好的方法?
我为 CPP 尝试的上述解决方案似乎确实实现了我正在努力实现的目标。通过从 XercesDOMParser
派生,我可以访问 GrammarResolver
,因此可以访问 XSModel
。该模型似乎包含我的数据结构需要解析的数据。
我正在尝试使用加载模式文件的 Xerces v3.2.2 移植一些 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 文档中找到任何会产生类似结果的内容。据我所知,我可以通过 xercesc::AbstractDOMParser
从 xercesc::GrammarResolver*
访问 XSModel*
但这需要我从解析器派生,因为它是一个受保护的函数。
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;
}
这是我必须走的路吗?这会起作用吗?是否有实际示例显示更好的方法?
我为 CPP 尝试的上述解决方案似乎确实实现了我正在努力实现的目标。通过从 XercesDOMParser
派生,我可以访问 GrammarResolver
,因此可以访问 XSModel
。该模型似乎包含我的数据结构需要解析的数据。