1

我一直在使用 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>节点,并检查它是否有子节点,而不是尝试任何处理。

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

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

4

2 回答 2

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 类中实现的回调调用您。根据您的需要在那里填充您的对象。

希望这可以帮助。

于 2012-05-01T16:20:01.163 回答
0

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

于 2012-05-01T16:27:58.010 回答