2012-04-30 13 views
1

私はC++とXerces-cを使ってXML Parserで作業していましたが、私は理解できない問題を抱えているようです問題は、私は:)周りに仕事を得ることができますが、その周りに自分の道を「ハック」したくない)C++ Xerces-c - nodeがプレースホルダーであるかどうかを調べる方法

私は私がしようとしている何本

<?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>ノードのように、処理を試みるのではなく、子ノードをチェックするだけです。

この理由は、ノードの値(たとえば、Title)と値(NewJobなど)を格納するクラス内にノード値を格納しているため、子エントリのリストもあるため、JobはノードエントリTitle、Position、SalaryはすべてJobの「子」エントリになります。しかし、Jobが既にPositionのエントリを持っていて、新しいエントリを作成してJobを追加するのではなく、既存のPositionエントリにPositionの値を追加するかどうかを確認することもできます。誰にでも感覚:)

私はそれを何かをコード化する誰かが期待していないと私はちょうどいくつかのヒントやポインタ:)!

+0

なぜ自分のクラスにノードを保存していますか? Xercesはそのための構造を提供しています。私は一般的には、各子エントリの名前をチェックし、それが 'Position'であればノードを返すことを考えます。 – lupz

答えて

0

この場合、SAXパーサを使用することをお勧めします。独自のオブジェクトを作成する場合は、DOMを作成する必要はなく、SAX実行中に自分のオブジェクトを簡単に埋め込むことができます。これによりメモリ消費量が削減され、大容量ファイルの処理速度が大幅に向上します。 SAX2XMLReader

あなたのMyDefaultHandlerに実装コールバックを介して呼び出されます:SAXパーサーを使用すると、SAXインタフェースの詳細なドキュメントはここで見つけることができます

SAX2XMLReaderImpl* sax_parser = new SAX2XMLReaderImpl(); 
MyDefaultHandler* docHandler = new MyDefaultHandler(); // derived from DefaultHandler 

sax_parser->setContentHandler(docHandler); 
sax_parser->parse(pszPath); 

のシーケンスであり、基本的に

XercesはXMLを解析しています。あなたのニーズに基づいてそこにあなたのオブジェクトを記入してください。

これが役に立ちます。

+0

これはDOMパーサを使用して行うことができます。パーサーは通常、異なる種類のノードにフラグを立てる(大文字小文字のノード/プレーン・キャラクタ・データ・ノード)。 – dirkgently

+0

確かに彼ら(DOMパーサー)がこれをやっています。しかし、独自のデータ構造も作成された場合、なぜDOMツリーを作成すべきですか?これ以上の情報がなければ、私はこの事実を与えられた元の質問から取ります。したがって、DOMツリーも作成しない方が良いです。 – Clemens

+0

私はOPの質問を読んでいたのとは反対に、私は彼がDOMパーサを使っているという意見でした。 – dirkgently

0

JobのタイプはELEMENT_NODEであるべきですが、他方はタイプTEXT_NODEである必要があります。 getNodeType()メンバーを使用してタイプを確認し、必要に応じて処理を進めることができます。

+0

Hmmm私はそれを試してみましたが、何らかの理由でがELEMENT_NODEとして登場した後、空白がTEXT_NODEとして表示されていたので、自分のコードでは値を含むノード:Sこれは大きな問題ではありません。私は回避策を考案しましたが、ハックを使用するのではなく、適切に把握するのが良いでしょう。P – KingTravisG

+0

@ SCassidy1986:これはパーサが空白の処理を保持します。この動作を無効にする可能性があります。あなたは 'DocumentHandler :: ignorableWhitespace()'を試すことができますか? – dirkgently

+0

私はまだSAXパーサを使用すると信じています;-) – Clemens

関連する問題