0

最近、tinyXMLを使い始めました。問題は、プログラムを実行してxmlを読み取ると、アクセス違反が返されることです。一般的な行は次のとおりです。

doc.FirstChildElement("Map")->FirstChildElement("Width")->GetText()

Visual Studioデバッガーを使用して、「マップ」に対してnullを返していることを確認し、null参照を使用して関数を呼び出しています。

これがコードの最初の行とxmlです

XMLDocument doc;
    doc.LoadFile(path.c_str());

    int width = atoi(doc.FirstChildElement("Map")->FirstChildElement("Width")->GetText());

XML:

<?xml version="1.0"?>
 <Master>
 <Map>
    <Width>5</Width>
    <Height>5</Height>
    <Layers>1</Layers>
    <Tiles>
        <Tile>
            <Id>1</Id>
            <Path>data/tiles/dirt-base.png</Path>
        </Tile>
    </Tiles>
    <Data>
        <DataLayer>1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1</DataLayer>
    </Data>
 </Map>
 </Master>

注意することが重要です。私は元々rootタグを持っていませんでしたが、機能しないときに追加しましたが、それでも追加しても役に立ちませんでした。どんな助けでもいただければ幸いです

4

3 に答える 3

3

変化する

int width = atoi(doc.FirstChildElement("Map")->FirstChildElement("Width")->GetText());

int width = atoi(doc.FirstChildElement("Master")->FirstChildElement("Map")->FirstChildElement("Width")->GetText());

それは私のPCで動作しています最新のtinyxmlを使用してください。

TinyXmlドキュメントによると

最初にLoadFileの戻り値を確認する必要があります

if (!_doc.LoadFile(filename))
{
    printf("load file=[%s] failed\n", filename);
    return -1;
}

次に、アクセス違反を回避するために要素が存在することを確認します。

TiXmlHandleを使用して要素をチェックする方が簡単です。

TiXmlHandle docHandle(&doc);
TiXmlElement* child = docHandle.FirstChild("Map").FirstChild("Width").ToElement();
if (child)
{
    // do something useful
于 2012-06-20T06:59:29.573 に答える
1

あなたがあなたの質問のコメントで言ったように、エラーコード3はfile not found あなたがおそらくこれを整理したということです、しかしこれの一般的な原因は単にパスのバックスラッシュを間違った方法で取得することです。

ちょうどこの正確な問題を自分で抱えていました。かなりのWeb開発を行った後、スクリプト/マークアップ/サーバー側/クライアント側のファンクが異なるために同じプロジェクト内でスラッシュが異なる方向にある環境(そして時々方向を逆にする必要がある環境)公開するときのスラッシュの半分の!)、これはたくさん発生します。それでも私は良い時間困惑しました。

参考までに、この考えられる解決策を遅らせてください。これは、TinyXMLとこの問題に関するGoogleの最も顕著な結果です。

于 2012-08-07T14:25:38.153 に答える
0

呼び出しているTinyXML関数の1つが無効なポインターを返しているように見えます。各呼び出しの結果を個別に確認してみてください。そうすれば、問題を特定することができます。

于 2012-06-20T06:31:13.580 に答える