1

XMLを使用するのは初めてで、現在C ++を使用してXMLファイルから整数を返そうとしています(実際にはdoubleを返したいのですが、まだそれほど遠くはありません)。私はRAPIDXMLと次の実装を使用しています:

すべてのファイルは同じディレクトリにあります。

XML(firstxml.xml):

<?xml version="1.0"?>
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="firstxsd.xsd">
    <A>10</A>
    <B>Hello</B>
</test>

XMLスキーマ(firstxsd.xsd):

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="test">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:integer" name="A"/>
        <xs:element type="xs:string" name="B"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

C ++(test.cxx):

#include <iostream>
#include <sstream>
#include <fstream>
#include "rapidxml-1.13/rapidxml.hpp"
#include "rapidxml-1.13/rapidxml_print.hpp"
#include <string>
#include <stdio.h>
#include <vector>

int main(int argc, char* argv[])
  {
    std::ifstream file ("firstxml.xml");
      if (file.is_open())
        {
          file.seekg(0,std::ios::end);
          int size = file.tellg();
          file.seekg(0,std::ios::beg);

          char* buffer = new char [size];

          file.read (buffer, size);
          file.close();

          rapidxml::xml_document<> doc;
          doc.parse<0>(buffer);
          rapidxml::xml_node<> *node = doc.first_node()->first_node();

          //Line which results in error
          std::cout << node->value()*10 << std::endl;

          delete[] buffer;
        }
  }

エラー:

test.cxx:52:31: error: invalid operands of types ‘char*’ and ‘int’ to binary ‘operator*’

私がオンラインで読んだチュートリアルから、私はファイルを正しく構築していると信じているので、ノードAからC++ファイルに解析される値は整数である必要があります。私が気づいたことの1つは、RAPIDXMLマニュアルでは、value()の仕様が次のとおりであることです。

Ch* value() const;

Description: Gets value of node. Interpretation of value depends on type of node. Note that value will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse. Use value_size() function to determine length of the value.

Returns: Value of node, or empty string if node has no value.

したがって、関数定義は常に文字ポインタを返すと言っていますが、「値の解釈はノードのタイプに依存します」という行は、タイプに依存する値を返すことを意味します。

私の問題をご覧いただきありがとうございます。どんな助けでも大歓迎です、

ポール。

4

3 に答える 3

0

「属性」の値にアクセスしたいと思うので、次のようにします...

cout << "最初のノードの名前は次のとおりです:" << doc.first_node()-> name()<< "\ n";

xml_node <> * node = doc.first_node( "foobar");

cout<<"ノードfoobarの値は"<<node-> value()<< "\ n";

for(xml_attribute <> * attr = node-> first_attribute(); attr; attr = attr-> next_attribute())

{cout<<"ノードfoobarには属性"<<attr-> name()<< "";

cout << "with value " << attr->value() << "\n";

}

また、rapidXMLチュートリアルもご覧ください...

http://rapidxml.sourceforge.net/manual.html簡単です!

于 2013-02-26T05:12:05.533 に答える
0

「価値の解釈はノードの種類に依存する」という言葉が何を意味するのかはわかりません。関数が返す場合、Ch pointerライブラリ開発者がそのような機能を提供した場合、関数は常にそのようなポインタを返すか、ランタイム例外を引き起こします。当然、aCh*にintを掛けようとすると、コンパイル時エラーが発生します。

関数が呼び出しコンテキストに依存する型を返すことができる唯一の方法は、特別なユーザー定義の戻り型(VARIANTまたはそのようなもの)を使用することです。Chこれは、ライブラリの基本的な文字タイプ(charまたは多分)の仮名にすぎないように思われますwchar_t

したがって、その「解釈...」通知によって、開発者はおそらく、ユーザーがノードのタイプ(ユーザー定義のスキーマに依存する)に従って文字列を適切に解釈する必要があることを意味していました。

atoi()数値のC文字列表現を対応する型に変換するには、( intに変換する)、 (doubleに変換する)などの標準Cライブラリの関数を使用できますatof()

于 2013-02-26T05:29:54.700 に答える
0

私が間違っている場合、誰かが私を訂正します。RapidXMLは、その場での解析の性質により、何らかの形式の文字列としてのみ値を提供すると思います。クラステンプレートは、charとwide charなどを処理するためのものである可能性がありますが、わかりません。charのみを使用します。

値の抽出を処理するために私が行ったのは、ヘルパークラスをrapidxml_utils.hppに追加することでした(実際にはどこにでも配置できましたが、そこには意味がありました)。静的関数を使用して、xmlノードまたは属性を値(またはデフォルト値の場合)に解析します。解析されません)。

これらのヘルパーにより、私は次のようなことができるようになりました。

    int Height = xml_helper::GetNodeInt(cur_node->first_node("Height"), 48);
    int Width = xml_helper::GetNodeInt(cur_node->first_attribute("Width"), 128);

あなたの場合、あなたはこのような私のヘルパークラスを使うかもしれません:

      //Line which results in error (altered to use my helper class, if node absent or not parse as integer uses zero)
      std::cout << xml_helper::GetNodeInt(node, 0)*10 << std::endl;

私のヘルパークラスは次のようになります(ある程度の検証を得るためにsscanfを使用しました):

class xml_helper
{
public:
    // a couple little helpers, lets you do this:
    // int Height = xml_helper::GetNodeInt(cur_node->first_node("Height"), 48);
    // int Width = xml_helper::GetNodeInt(cur_node->first_node("Width"), 128);
    static int GetNodeInt(rapidxml::xml_base<>* node, int DefaultValue)
    {
        int temp;
        try
        {
            if (node == 0) return DefaultValue;
            if (sscanf(node->value(), "%d", &temp) != 1) return DefaultValue;
            return temp;
            //return atoi(node->value());
        }
        catch (...) { return DefaultValue; }
    }

    static unsigned int GetNodeUInt(rapidxml::xml_base<>* node, unsigned int DefaultValue)
    {
        unsigned int temp;
        try
        {
            if (node == 0) return DefaultValue;
            if (sscanf(node->value(), "%u", &temp) != 1) return DefaultValue;
            return temp;
            //return strtoul(node->value(), NULL, 0);
        }
        catch (...) { return DefaultValue; }
    }

    static long long GetNodeLL(rapidxml::xml_base<>* node, long long DefaultValue)
    {
        long long temp;
        try
        {
            if (node == 0) return DefaultValue;
            if (sscanf(node->value(), "%lld", &temp) != 1) return DefaultValue; //C99 covers %lld
            return temp;
            //return strtoll(node->value(), NULL, 0); //C++11, could use _strtoi64 in VS until then?
        }
        catch (...) { return DefaultValue; }
    }

    static double GetNodeDouble(rapidxml::xml_base<>* node, double DefaultValue)
    {
        double temp;
        try
        {
            if (node == 0) return DefaultValue;
            if (sscanf(node->value(), "%lf", &temp) != 1) return DefaultValue; // could use strtod
            return temp;
        }
        catch (...) { return DefaultValue; }
    }

    static std::string GetNodeStr(rapidxml::xml_base<>* node, std::string DefaultValue)
    {
        try
        {
            if (node == 0) return DefaultValue;
            return node->value();
        }
        catch (...) { return DefaultValue; }
    }
};

うまくいけば、これはあなたや他の誰かがrapidxmlを使用していて、整数、倍精度浮動小数点数、またはノードから何かを取得するための迅速な方法を必要としている人に役立つかもしれません。確かに他のタイプにも拡張できます。今まで必要だったタイプしかありませんが、要点はわかります。

于 2013-10-24T15:37:53.297 に答える