我一直在使用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条目...如果这样做对任何人都有意义:))
任何帮助都会非常感激,我不希望任何人为我编写代码或任何东西只是一些提示或指针:)!
答案 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()
成员检查类型,然后根据需要继续。