2012-04-30 27 views
1

我一直在使用C++和Xerces-c处理XML解析器,但我似乎遇到了一个我无法弄清的问题(不是主要的的问题,我可以得到一个解决办法,但不想“黑客”,围绕我的方式:))C++ Xerces-c - 如何判断节点是否占位符

我有这样

<?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> 

一个XML文件,我试图要做的是弄清楚节点是否只是其他子节点的“占位符”,例如如<Person>节点或<Job>节点,只需检查它的子节点,而不尝试任何处理。

原因是我将节点值存储在一个存储节点名称(例如标题)和值(例如NewJob)的类中,以及子条目列表中,所以Job将是一个节点条目,那么标题,职位和薪资将全部是Job的“子”条目。不过,我希望能够检查Job是否已经有位置条目,而不是创建新条目并将其添加到Job中,只需将Position的值添加到已存在的Position条目中即可感觉任何人:)

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

+0

为什么你将节点存储在自己的类中? Xerces为此提供结构。一般来说,我会考虑检查每个子项的名称并返回节点,如果它是'位置'。 – lupz

回答

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

您将通过您的MyDefaultHandler实施的回调被称为类,而Xerces解析XML。根据您的需要填写您的物件。

希望这会有所帮助。

+0

这可以使用DOM解析器完成。解析器通常会标记不同类型的节点(例如text-nodes/plain-char-data-nodes)。 – dirkgently

+0

当然,他们(DOM解析器)正在这样做。但是,如果创建自己的数据结构,为什么还要创建一个DOM树。没有更多的信息,我从给出的原始问题中获取这个事实,因此最好不要创建一个DOM树。 – Clemens

+0

我对OP问题的解读是相反的:我认为他正在使用DOM解析器。 – dirkgently

0

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

+0

嗯我曾试过,但由于某种原因是作为一个ELEMENT_NODE,然后它显示为一个TEXT_NODE后的空白,所以在我的代码中它正在处理为包含一个值的节点:S这不是一个大问题,因为我提出了一个解决方法,但是很好地理解它,而不是使用黑客:P – KingTravisG

+0

@ SCassidy1986:这是因为解析器是保留空白处理。这种行为很可能会被关闭。你可以试试'DocumentHandler :: ignorableWhitespace()'吗? – dirkgently

+0

我仍然相信使用SAX解析器这个任务会更容易;-) – Clemens

相关问题