C++でXPath指定でXMLを読む方法を知りたい

このQ&Aのポイント
  • C++でプログラミングを学んでいる方にとって、XPath指定でXMLを読む方法は重要です。この記事では、C++でXPathを利用するためのライブラリの選び方や、具体的なサンプルコードを解説します。
  • C++でプログラミングを学んでいる方にとって、XPath指定でXMLを読む方法は重要です。この記事では、XPathをサポートしているXerces、Xalan、libxml2といったライブラリについて紹介し、それぞれの特徴や使い方を解説します。
  • C++でプログラミングを学んでいる方にとって、XPath指定でXMLを読む方法は重要です。この記事では、XPath指定のサンプルコードを提供し、具体的にどのように使用するのかを詳しく解説します。さらに、Xerces、Xalan、libxml2といったライブラリについても紹介します。
回答を見る
  • ベストアンサー

c++でxpath指定でXML

c++でプログラミングを学んでいます。 XMLを使って設定ファイルを作ろうと思っています。 プログラム側で、あらかじめどのようなフォーマットのXMLかは知っているので、 ルートからのxpathを文字列で指定して要素を読みに行きたいのですが、 どのライブラリがこれを出来るのかわからない(1)、 また、サンプルが見付からない(2)、 ので困っています。 (1)と(2)について教えてください。★ (1)については、XercesとXalanとlibxml2が出来そう?、 (2)については直接指定のサンプルを全くみつけられていない、というところです。 (ソースコードについてくるサンプルでも直接指定は見つけられていなくて、複雑だと読めなくて困ってます。) (出来そうだという書き込みは、日本語圏・英語圏でちらほら見られる。) 因みに、boost::property_treeで読もうと思ったりしましたが、属性を検索キーにする必要があって、xpathが利用できないと複雑なプログラムを書かないとならないので、やめました。 そこまでするならXMLのフォーマットを変えよう→XMLの意味が無い→何としてもxpath、と…。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

(1) libxml2 または Xalan+Xerces のどちらでもできるかと。 (2) libxml2 だと http://xmlsoft.org/examples/xpath1.c のサンプルでは参考になりませんか? ほとんどそのままだと思いますけど。

nico60000
質問者

お礼

ありがとうございます。 libxml2で解決できました! あとは、LGPLのライセンスを理解しなければならないのかな…。

関連するQ&A

  • XML MAGAZINE 03のサンプルについて教えてください

    XML MAGAZINE03のサンプルプログラム(最初のページから紹介している書籍検索プログラム)を作ろうとしています。そこで、BookFinder.javaでimportを使っていますが import org.w3c.dom.Document; import org.apache.xerces.parsers.DOMParser; import org.apache.xalan.xpath.xdom.XercesLiaison; import org.apache.xalan.xslt.XSLTProcessorFactory; import org.apache.xalan.xslt.XSLTResultTarget; importはパッケージのクラスを利用する と私は解釈していますが、では、PCにapacheを インストールしなくてはいけないのでしょうか? またw3cはどのように設定したらよいのでしょうか? ひょっとしたら根本的に勘違いや間違いをしているの かもしれませんが、どなたかご教授ください、お願いします。

    • 締切済み
    • XML
  • XML::DOM / XML::XPathでソート

    XML::DOMで効率的なソートの方法はどんなものがありますでしょうか。 一応動くものは作れたのですが、効率的とは言い難く、しかも ソート項目が一意のデータでないといけないという欠点があります。 ############################################### use XML::DOM::XPath; my $xml = <<EOM; <?xml version="1.0" encoding="UTF-8" ?> <list> <item id="10">Apple</item> <item id="5">Orange</item> <item id="20">Melon</item> </list> EOM my $parser = XML::DOM::Parser->new(); my $doc = $parser->parse( $xml ); ## <item>タグの一覧を作成 my @list = $doc->findnodes('/list/item'); ## <item>タグ id属性一覧を作成 my @idlist = map{ $_->getAttribute("id") } @list; ## id属性順にソート foreach my $id ( sort{ $a<=>$b } @idlist ){ ## id属性値を指定してノードリストを取得 my @item = $doc->findnodes('/list/item[@id='.$id.']'); ## idは一意なのでリストの先頭で固定 print $item[0]->getAttribute('id')."\n"; print $item[0]->getFirstChild->getNodeValue."\n"; } ############################################### ハッシュなら sort{ $hoe{$b} <=> $hoe{$a} } keys %hoe といった方法があるのですが、XML::DOMの場合は同じようにいきません。 良い方法がありましたらお願いします。

    • ベストアンサー
    • Perl
  • XML::LibXMLのfindnodes()で、ワイルドカードを使いたい

    XML::LibXMLでXPathを使いたいのですが、 ワイルドカードの指定がうまくいきません。 要素名に*を当てはめたいのですが、、、、 例えば以下の通りです。 下記XMLのid="1-1"とid="1-2"を抜きだしたいのです。 できればXPathにて指定したいのですが、、、 教えてください。 my $dom = $parser->parse_file($xml_file_str) or die; $x = "//Test/TestText[@id="1-*"]/text()"; $c = $dom->findnodes($x); 解析対象XML <XML> <Test> <TestText id="1-1">テスト1</TestText> <TestText id="1-2">テスト2</TestText> <TestText id="2-1">テスト3</TestText> </Test> </XML>

    • ベストアンサー
    • Perl
  • C++を使った汎用性のあるXML変換プログラム

    現在WindowsXP,VC++2008,でXMLの変換プログラムを作っています。XMLのパーサはxerces3.0.1をビルドしました。 JAVAなら少々経験がありますが、C++は初めてです。 要望として、日本語以外のOSやLINUX類でもできるだけそのまま動かせるよう留意してほしいと言われたのですが、具体的にどうやって気をつければよいのか思案中です。 まず、テキストファイルを辞書として読み込むので、その文字コードとか問題になるのかなと思います。今はShift-jisで何の変換もなくUTF-8のXML変換ができていますが、xercesに変換関数があるからです(おそらく内部はUnicode)。LINUXにしたらeuc-jpだし、欧州だとまたちがうだろうから、どのように辞書を定義するのがよいのかわからなくて困っています。 文字コード変換ライブラリにICUというのがあるところまでは調べましたが、これをどう変換に活かせばos,言語環境に依存しにくいプログラムがつくれるのかよくわかりません。 あと、いろいろ検索していると、windows系でしか働かない関数やunix系のものとかもいろいろあるのですね。これら、どの関数が使えてどれがこっちでは使えないですとかの情報はどうやったら手に入るのでしょう?ひとつひとつの関数を検索するしかないでしょうか。 漠然とした疑問でほんとうに恐縮ですが、ご意見、参考サイトなどお持ちの方、どうぞ教えてください。

  • JavaでXMLといったら何を使いますか?

    JavaでXMLファイルを取り扱うときには、DOM, SAX, xerces, relaxer, XMLSchema, XPathといったキーワードが出てきますが、とりあえずXMLファイルを読めればいい、というときはどのライブラリを使うのがいいのでしょうか? 利用目的としては、単純なXMLからデータを読み込んで、それをVelocityテンプレートとマージしてファイルに保存することを考えています。 例 <javafile>  <name>Foo.java</name>  <class>   <modifier>public</modifier>   <name>Foo</name>   <method>    <modifier>public</modifier>    <modifier>static</modifier>    <type>void</type>    <name>main</name>    <arg>     <type>String[]</type>     <name>args</name>    </arg>    <body>     System.out.println("Hello");    </body>   </method>  </class> </javafile> から public class Foo{  public static void main(String[] args){   System.out.println("Hello");  } } を作る感じです。

    • ベストアンサー
    • Java
  • FOPでPDF作成時の日本語表示の方法について

    FOP(Fop-0.20.2、jpfop-0.20.2)でXMLをPDFに変換するのに以下のように実行しました。PDFは作成できたのですが開こうとすると「文書を作成するときにエラーが発生しました。修復できません」となってしまって、開くことができません。 userconfig.xmlにはMSGothicのフォントの設定をしました。 サンプルに入っているcid-fonts.foも試してみましたが、日本語の表示が##になってしまい表示ができません。 どのようにすれば、日本語がきちんと表示されるPDFが作成できるのでしょうか? よろしくお願いします。 set XERCES=lib\xerces-1.2.3.jar set XALAN=lib\xalan-2.0.0.jar set FOP=build\fop-0.20.2-jp.jar set BATIK=lib\batik.jar set FRAMEWORK=lib\avalon-framework-4.0.jar set LOGKIT=lib\logkit-1.0b4.jar set JIMI=lib\jimi-1.0.jar set USERCONFIG=conf\userconfig.xml java -cp %FOP%;%BATIK%;%XALAN%;%XERCES%;%FRAMEWORK%;%LOGKIT%;%JIMI% org.apache.fop.apps.Fop -c %USERCONFIG% -xml book.xml -xsl book.xsl -pdf book.pdf

    • ベストアンサー
    • XML
  • XMLShemaからXML文書を作成

    こんにちは VB2005でXML文書をアプリを作成指定しています。 XML文書を読み込んでバリデーションをかけて、OKであれば処理続けていくプログラムです。 実際の業務でバリデーションのために使用する XMLSchemaをもらったのですが、階層が深くなかなか複雑なようで、 ファイルの数は100個近くあります。 プログラムのテストのために、指定のXMLSchema全ての構造体を反映したXMLファイルを作成したいのですが、 手動ではかなり厳しいです。 ちなみに、メインとなるXSDファイルがありますが、 その中では、子要素となる構造を定義したXSDファイルを importやincludeしているだけです。 このようなXSDファイルを指定して、全ての構造を網羅したXMLファイルを作成してくれるツールは存在しますでしょうか? もしくは、そのようなツールを作成するプログラムのサンプルでも結構です。 以上、よろしくお願いいたします。

    • ベストアンサー
    • XML
  • 【アプリ開発】日本語を含むXMLファイル読み込み

    iOSアプリ開発しています。(iOS5 SDK/Xcode4.3/Objective-C) XMLファイル(日本語を含む)を読み込みそれを表示さたいのですが文字化けしてしまい困っています。 今、私が試しているのは「iPhone/iPadアプリ開発逆引き大全500の極意」という書籍のサンプルの中の「XMLファイルを読み込む」というサンプルです。サンプルだとXMLファイルで読み込む文字列はアルファベットなのでちゃんとうごいて文字化けせずに表示もされます。ですが、xmlファイルの読み込みたい文字列を日本語にすると「ÅÏ∞‰æ」のような感じで文字化けしてしまいます。 このサンプルのxmlファイル読み込みにはxmlParseFile関数、libxml2を使用していて、XMLファイル(persons.xml)を読み込んでUITextViewに表示するプログラムです。 サンプルのxmlファイル内にある文字列「masuda tomoaki」「yamada taro」「tanaka ziro」をそれぞれ「松田」「山田」「田中」と書き換えて保存してアプリを実行すると文字化けします。 他にどこか書き換えないといけないのでしょうか? ↓サンプルコードを付けています。 どうしたら日本語も読み込めるようになるか、どなたかアドバイスをお願いします。ネットで何日もかけて調べても解決できなかったのでどうか助けてください。 何卒よろしくお願いします。 ↓「iPhone/iPadアプリ開発逆引き大全500の極意」のサンプルダウンロードページ(この中のBasic195) http://www.shuwasystem.co.jp/support/7980html/3352.html 以下、サンプルのコード「ViewController.h」「ViewController.m」「persons.xml」です。 【ViewController.h】 #import <UIKit/UIKit.h> #include <libxml/parser.h> #include <libxml/xpath.h> @interface ViewController : UIViewController { IBOutlet UITextView *textView; } - (IBAction)clickRead:(id)sender; @end 【ViewController.m】 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } - (IBAction)clickRead:(id)sender { NSString *path = [[NSBundle mainBundle] pathForResource:@"persons" ofType:@"xml"]; xmlDocPtr doc = xmlParseFile([path cStringUsingEncoding:NSUTF8StringEncoding]); // XMLファイルを読み込む xmlXPathContextPtr context = xmlXPathNewContext(doc); xmlChar *xpath = (xmlChar*)[@"//person/name" cStringUsingEncoding:NSUTF8StringEncoding]; xmlXPathObjectPtr result = xmlXPathEval(xpath , context); xmlNodeSetPtr nodeset = result->nodesetval; NSMutableString *text = [NSMutableString string]; for ( int i=0; i<nodeset->nodeNr; i++ ) { xmlChar *element = xmlNodeListGetString(doc, nodeset->nodeTab[i]->children, 1); NSLog(@"element: %s", element); [text appendFormat:@"name: %s\n", element]; } xmlXPathFreeObject(result); xmlXPathFreeContext(context); textView.text = text; } @end 【persons.xml】 <?xml version="1.0" encoding="utf-8" ?> <persons> <person id="01"> <name>masuda tomoaki</name> <age>43</age> <address>tokyo</address> </person> <person id="02"> <name>yamada taro</name> <age>30</age> <address>oosaka</address> </person> <person id="03"> <name>tanaka ziro</name> <age>20</age> <address>hokkaido</address> </person> </persons>

  • DTDとXML Schemaでのデフォルト値の指定について

    以下のようなXMLをパーズするプログラムがあります。 ------------------------------------------------------------------ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); dbf.setValidating(true); DocumentBuilder documentBuilder = factory.newDocumentBuilder(); Document doc = documentBuilder.parse(new InputSourc("a.xml")); ------------------------------------------------------------------ a.xmlに以下のようなXMLの構造をDTDで指定した場合のxmlをパーズさせると、 <!DOCTYPE a [ <!ELEMENT a (#PCDATA)> <!ATTLIST a a1 CDATA "abc"> ]> <a/> 上記のプログラム3行目のvalidationの設定がtrue、falseに関わらす、 <a a1="abc"/> というような形式のドキュメントオブジェクトが返ってきます。 ですが、以下のようにXMLの構造をXML Schemaで定義した場合、 a.xml <a xsi:noNamespaceSchemaLocation="b.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> b.xsd <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="a"> <xsd:complexType> <xsd:attribute name="a1" type="xsd:string" default="abc"/> </xsd:complexType> </xsd:element> </xsd:schema> 返ってくるドキュメントオブジェクトのa要素には、validationがtrueの場合はa1属性が含まれる、falseの場合は含まれません。 これは正しい動作なのでしょうか? また、XML Schemaの場合もvalidationがtrue、falseに関わらず、 デフォルト値が指定された属性を含めることはできないのでしょうか?

    • ベストアンサー
    • XML
  • ActionScript3でのXML操作

    ActionScriptの初心者です。お世話になります。 既存のXMLにデータを追加していきたいのですがやり方がわかりません。データは以下のようなフォーマットです。 <books> <book> <title>...</title> <author priority="1">...</author> <!--■authorのpriorityを参照してこの辺に追加したりします--> <author priority="2">...</autor> <book> <books> Web上、adobeのリファレンスでいろいろ探したのですが、ほとんどXMLのデータを参照する方法しか紹介されていません。XMLのデータにタグを追加したり、削除したりする方法、またはWeb上のサンプル等何でもよいので、おしえていただけますでしょうか? または、XMLクラスを使わず行単位で正規表現で文字処理する方法でもかまいません。よろしくお願いします。m(_*_)m バージョン:AcrionScript3.0 (XMLDocumentなどのクラスを使わず、W3Cで定義されているXPathのようなアクセス方法、.とか、@とかでアクセスする方法です。)

    • ベストアンサー
    • Flash