C++ Xerces-c - 如何判断节点是否占位符

C++ Xerces-c - How to tell if node is placeholder

本文关键字:判断 节点 是否 占位符 Xerces-c 何判断 C++      更新时间:2023-10-16

我一直在使用C++和Xerces-c开发XML解析器,但我似乎遇到了一个我无法弄清楚的问题(不是一个大问题,我可以解决,但不想"破解"我的方式:)(

我有一个这样的XML文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Config>
<Person>
    <Title>Mr.</Title>
    <Forename>Stephen</Forename>
    <Surname>Cassidy</Surname>
    <Job>
        <Title>Position1</Title>
        <Position>Worker</Position>
        <Salary>£6.40</Salary>
    </Job>
    <Job>
        <Title>NewJob</Title>
        <Position>PositionWorker1</Position>
        <Position>AnotherPosition</Position>
        <Salary>£12,000</Salary>
    </Job>
</Person>

我试图做的是弄清楚一个节点是否只是其他子节点的"占位符",例如<Person>节点或<Job>节点,然后只检查它是否有子节点,而不是尝试任何处理。

这样做的原因是我将节点值存储在一个存储节点名称(例如标题(和值(例如NewJob(以及子条目列表的类中,因此Job将是一个节点条目,然后Title,Position和Salary 都将是Job的"子"条目。但是,我希望能够检查工作是否已经有职位条目,而不是创建一个新条目并将其添加为工作,只需将职位的值添加到已经存在的职位条目中......如果这对任何人来说都有意义:)

任何帮助将不胜感激,我不希望任何人为我编写代码或任何东西,只是:)一些提示或指示!

我建议在这种情况下使用SAX解析器。如果构建自己的对象,则无需创建 DOM,并且可以在 SAX 运行期间轻松填充自己的对象。这将减少内存消耗,并且处理大文件的速度可能会快得多。

基本上,使用 SAX 解析器是一系列

SAX2XMLReaderImpl*  sax_parser = new SAX2XMLReaderImpl();
MyDefaultHandler*  docHandler = new MyDefaultHandler(); // derived from DefaultHandler
sax_parser->setContentHandler(docHandler);
sax_parser->parse(pszPath);

可在此处找到 SAX 接口的详细文档:SAX2XMLReader

您将在 Xerces 解析 XML 时通过 MyDefaultHandler 类中实现的回调进行调用。根据您的需要在那里填充您的对象。

希望这有帮助。

Job应该有ELEMENT_NODE类型,而另一个应该有TEXT_NODE类型。可以使用 getNodeType() 成员检查类型,然后根据需要继续操作。