我知道如何使用XercesDOMParser从xml文件创建一个完整的dom:
xercesc::XercesDOMParser parser = new xercesc::XercesDOMParser();
parser->parse(path_to_my_file);
parser->getDocument(); // From here on I can access all nodes and do whatever i want
Run Code Online (Sandbox Code Playgroud)
嗯,这有用......但是如果我想解析一个字符串怎么办?就像是
std::string myxml = "<root>...</root>";
xercesc::XercesDOMParser parser = new xercesc::XercesDOMParser();
parser->parse(myxml);
parser->getDocument(); // From here on I can access all nodes and do whatever i want
Run Code Online (Sandbox Code Playgroud)
我正在使用版本3.在里面AbstractDOMParser
我看到了解析方法及其重载版本,只解析文件.
如何从字符串中解析?
我似乎不明白的目的XMLString::transcode(XMLCh*)
和XMLString::transcode(char*)
,因为很明显,我不明白之间的差别XMLCh*
和char*
.有人可以让我更清楚吗?
我研究了很多关于如何在C++中读写(更新)一个简单的.xml文件,但我无法为它开发代码.
我工作并安装了xerces-c库,我认为需要使用DOM或SAX2解析器来读取它.
请有人帮忙为它编写代码.
执行此操作的示例代码将非常有用.
谢谢和最诚挚的问候,Adarsh Sharma
我支持使用Xerces-C进行XML解析的遗留C++应用程序.我被.Net宠坏了,并习惯使用XPath从DOM树中选择节点.
有没有办法在Xerces-C中访问一些有限的XPath功能?我正在寻找像selectNodes("/ for/bar/baz")之类的东西.我可以手动执行此操作,但相比之下XPath非常好.
我想将一个项目(我不太熟悉的遗留代码)从Xerces-C v2.x迁移到v3.x.
事实证明,Xerces-C v3删除了DOMBuilder类.该迁移归档告诉我:
...许多DOM接口(DOMBuilder,DOMWriter,DOMInputSource等)被替换为最终DOM Level 3规范一致性工作的一部分.
真好.但有没有关于如何将依赖这些类的代码迁移到新API的指南?
当我尝试使用 Xerces-c 验证 XML 时,我的应用程序有时会崩溃。
这是堆栈跟踪:
#0 0x000000000064ead0 in xercesc_3_2::XMLMutex::lock() ()
#1 0x000000000064eb32 in xercesc_3_2::XMLMutexLock::XMLMutexLock(xercesc_3_2::XMLMutex*) ()
#2 0x00000000005c8d5d in xercesc_3_2::XMLScanner::commonInit() ()
#3 0x00000000005c6ff7 in xercesc_3_2::XMLScanner::XMLScanner(xercesc_3_2::XMLValidator*, xercesc_3_2::GrammarResolver*, xercesc_3_2::MemoryManager*) ()
#4 0x00000000006caf59 in xercesc_3_2::IGXMLScanner::IGXMLScanner(xercesc_3_2::XMLValidator*, xercesc_3_2::GrammarResolver*, xercesc_3_2::MemoryManager*) ()
#5 0x00000000006858aa in xercesc_3_2::XMLScannerResolver::getDefaultScanner(xercesc_3_2::XMLValidator*, xercesc_3_2::GrammarResolver*, xercesc_3_2::MemoryManager*) ()
#6 0x00000000005da3f8 in xercesc_3_2::AbstractDOMParser::initialize() ()
#7 0x00000000005da163 in xercesc_3_2::AbstractDOMParser::AbstractDOMParser(xercesc_3_2::XMLValidator*, xercesc_3_2::MemoryManager*, xercesc_3_2::XMLGrammarPool*) ()
#8 0x00000000005e81bc in xercesc_3_2::XercesDOMParser::XercesDOMParser(xercesc_3_2::XMLValidator*, xercesc_3_2::MemoryManager*, xercesc_3_2::XMLGrammarPool*) ()
#9 0x00000000004f0323 in KEventUtils::validateXML(std::string) (this=0xdbb030, xmlFile="/mnt/lprsResults3//2017/09/18/C01/P00C013-2017091803862.xml.1.xml") at src/KEventUtils.cpp:315
#10 0x00000000004c3861 in ACSTrigger::transcodeVideo(int) (this=0xdbe170, id=0) at src/acsTrigger.cpp:1314
#11 0x00000000004cacaa in …
Run Code Online (Sandbox Code Playgroud) 我无法理解Xerces-C++内存管理.
如果我有这个(示例)XML文件"config.xml":
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<port>
<reference>Ref1</reference>
<label>1PPS A</label>
<enabled>true</enabled>
</port>
</settings>
Run Code Online (Sandbox Code Playgroud)
而这段代码:
#include <xercesc/dom/DOM.hpp>
XERCES_CPP_NAMESPACE_USE
DOMElement *nextChildElement(const DOMElement *parent)
{
DOMNode *node = (DOMNode *)parent->getFirstChild();
while (node)
{
if (node->getNodeType() == DOMNode::ELEMENT_NODE)
return (DOMElement *)node;
node = node->getNextSibling();
}
return nullptr;
}
int main(int argc, char **argv)
{
XMLPlatformUtils::Initialize();
XMLCh tempStr[100];
XMLString::transcode("LS", tempStr, 99);
DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(tempStr);
DOMLSParser *parser = ((DOMImplementationLS*)impl)->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0);
DOMDocument *doc = impl->createDocument(0, 0, 0);
doc = parser->parseURI("config.xml");
DOMElement *el = doc->getDocumentElement(); …
Run Code Online (Sandbox Code Playgroud) 我尝试在 CentOS 8 上安装最新的 PostGIS 3.0.x,但没有成功。
我认为没有人在 RHEL 8 或 CentOS 8 上运行 PostGIS,我不明白为什么不这样做。貌似无法安装。
我已通过禁用 RHEL AppStream 成功安装了 Postgres 12.0
我在 CentOS 8 上安装 postgres 12 所采取的步骤:
1)
#dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Run Code Online (Sandbox Code Playgroud)
2)
#dnf --disablerepo AppStream install postgresql12
#dnf --disablerepo AppStream install postgresql12-server
Run Code Online (Sandbox Code Playgroud)
我现在正在尝试安装 PostGIS。
#dnf list --available | grep postgis30
Run Code Online (Sandbox Code Playgroud)
我看到 postgis30_96 是最新提供的(如下所列):
postgis30_96.x86_64 3.0.0alpha4-6.rhel8 pgdg96
postgis30_96-client.x86_64 3.0.0alpha4-6.rhel8 pgdg96
postgis30_96-client-debuginfo.x86_64 3.0.0alpha4-6.rhel8 pgdg96
postgis30_96-debuginfo.x86_64 3.0.0alpha4-6.rhel8 pgdg96
postgis30_96-devel.x86_64 3.0.0alpha4-6.rhel8 pgdg96
postgis30_96-docs.x86_64 3.0.0alpha4-6.rhel8 pgdg96
postgis30_96-gui.x86_64 3.0.0alpha4-6.rhel8 pgdg96
postgis30_96-gui-debuginfo.x86_64 3.0.0alpha4-6.rhel8 pgdg96
postgis30_96-utils.x86_64 3.0.0alpha4-6.rhel8 pgdg96 …
Run Code Online (Sandbox Code Playgroud) 我一直在玩Xerces-C XML库.
我有这个简单的例子,我正在玩.
我似乎无法在没有泄漏内存和没有segfaulting的情况下运行它.这是一个或另一个.
当我在"清理"下删除解析器对象时,总会发生段错误.
我尝试过同时使用2.8和2.7版本的库.
注意:我从代码中取出了所有异常检查,我得到了相同的结果,没有它.为了便于阅读和简化,我将其从下面的代码中删除.
任何精通Xerces的人都在乎提出一些建议吗?
我无法从后面的跟踪中得到很多信息,它只是跳进了超类析构函数并在那里进行了分类.
回溯:
(gdb) bt
#0 0x9618ae42 in __kill ()
#1 0x9618ae34 in kill$UNIX2003 ()
#2 0x961fd23a in raise ()
#3 0x96209679 in abort ()
#4 0x95c5c005 in __gnu_cxx::__verbose_terminate_handler ()
#5 0x95c5a10c in __gxx_personality_v0 ()
#6 0x95c5a14b in std::terminate ()
#7 0x95c5a6da in __cxa_pure_virtual ()
#8 0x003e923e in xercesc_2_8::AbstractDOMParser::cleanUp ()
#9 0x003ead2a in xercesc_2_8::AbstractDOMParser::~AbstractDOMParser ()
#10 0x0057022d in xercesc_2_8::XercesDOMParser::~XercesDOMParser ()
#11 0x000026c9 in main (argc=2, argv=0xbffff460) at test.C:77
Run Code Online (Sandbox Code Playgroud)
代码:
#include <string> …
Run Code Online (Sandbox Code Playgroud)