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

时间:2012-04-30 21:40:51

标签: c++ xml-parsing xerces-c

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

我有一个像这样的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>节点一样,只检查子节点,而不是尝试任何处理。

这样做的原因是我将节点值存储在存储节点名称(例如Title)和值(例如NewJob)的类中,以及子条目列表中,因此Job将是节点条目,那么Title,Position和Salary都将是Job的“child”条目。但是我希望能够检查Job是否已经有Position的条目,而不是创建一个新条目并添加它Job,只需将Position的值添加到已存在的Position条目...如果这样做对任何人都有意义:))

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

2 个答案:

答案 0 :(得分:0)

我建议在这种情况下使用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类中实现的回调调用。根据您的需要填写您的物品。

希望这有帮助。

答案 1 :(得分:0)

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