スポンサーリンク

XMLパーサーpugixml を試す(読み込み,日本語)

マルチバイトであればタグが日本語でも動作するが、Unicodeの場合タグが英語でなければ取得できない。

マルチバイトの場合

#include <iostream>

#include <string>

#include "pugixml.hpp"


const char* data() {
    return
        R"(
<?xml version="1.0" encoding="Shift-JIS"?>
<data date="2022-06-15">
  <名前>
    <a>田中</a>
    <b>中山</b>
    <c>山本</c>
  </名前>
</data>
)";
}

      
int main()
{
  pugi::xml_document doc;

  std::string txt = data();
  pugi::xml_parse_result result = doc.load_buffer(txt.data(), txt.size(), 0,pugi::xml_encoding::encoding_auto);


  std::cout << doc.child("data").attribute("date").value() << std::endl;

  for (auto point : doc.child("data").children("名前")) {

    std::cout << point.name() << std::endl;

    for (auto val : point.children()) {
      std::cout <<
        val.name() << " : " <<
        val.child_value() <<
        std::endl;


    }
  }

}

utf8の場合

#include <iostream>

#include <string>

#include "pugixml.hpp"


const char* data() {
  return
    u8R"(
<?xml version="1.0" encoding="UTF-8"?>
<data date="2022-06-15">
  <names>
    <a>田中</a>
    <b>中山</b>
    <c>山本</c>
  </names>
</data>
)";
}
      
      
int main()
{
  std::wcout.imbue(std::locale(""));

  pugi::xml_document doc;

  pugi::xml_parse_result result = doc.load_string(data());

  std::cout << doc.child("data").attribute("date").value() << std::endl;

  for (auto point : doc.child("data").children("names")) {

    std::cout << point.name() << std::endl;

    for (auto val : point.children()) {
      std::wcout <<
        pugi::as_wide(val.name()) << " : " <<
        pugi::as_wide(val.child_value()) <<
        std::endl;
    }
  }

}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: