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、役職と給与はすべて、ジョブの「子」エントリになります。ただし、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には type が必要ですがELEMENT_NODE、もう一方にはtype が必要TEXT_NODEです。メンバーを使用getNodeType()してタイプを確認し、必要に応じて続行できます。

于 2012-05-01T16:27:58.010 に答える