XMLパーサは、実用レベルから習作レベルまで、雨後の筍ほどもある。C++で使えるライブラリを探した。
XML関係の仕様は, XSLT, XQuery, XLink, XPointer, XPath など多くある。
XLink 1.1 (XLink 1.0 の不具合修正), XPointer は XBRL で使われている。DocBook v5 は XLink, XInclude 1.0 を使っている。SVG 1.1 は XLink を使っている。OpenDocument v1.3 は, MathML 2.0, RELAX NG, SVG 1.1, XForms 1.0, XLink, XPath 1.0, XSL, XSLT など.
XMLパーサは, これらの仕様のうちアプリケイションの基礎となるものについて、最低限 XPath ぐらいは備えていてほしい。
XSLT, XPath, XQuery は組み合わせがある。
| XSLT | XPath | XQuery |
|---|---|---|
| XSLT 3.0 (2017-06-08) | XPath 3.1 (2017-03-21) | XQuery 3.1 (2017-03-21) |
| XSLT 2.0 or XSLT 3.0 | XPath 3.0 (2014-04-08) | XQuery 3.0 (2014-04-08) |
| XSLT 2.0 (2007-01-23). 2nd 2021-03-30. | XPath 2.0 (2007-01-23). 2nd 2010-12-14. | XQuery 1.0 (2007-01-23). 2nd 2010-12-14. |
XQuery 3.0 は XPath 3.0 の拡張。XQuery 1.0 は XPath 2.0 の拡張。
XPath 2.0 以降は強い型付けで, XPath 1.0 と非互換。処理系が XPath 1.0 compatibility mode (旧名 type exception policy) 値として真を返す場合, XPath 1.0 との互換性を提供。XSLT 2.0 でも, xsl:supports-backwards-compatibility システムプロパティが "yes" を返すとき, 後方互換性をサポートする。
XMLパーサ「だけ」を使うことは少ない。利用するフレームワークがXML関連のライブラリを提供していれば、まずい実装でない限り、それを使えばいい。
Qt5: Qt XMLモジュールがある。SAX を使いたい場合, core モジュールの QXmlStreamReader クラスと QXmlStreamWriter クラスを使え。DOM は xml モジュールの QDomDocument クラス.
Qt5 の xmlpatterns モジュールは, XPath 2.0, XQuery 1.0, XSLT および XML Schema を提供。しかし、Qt6 で単に廃止された。XMLは不人気.
Qt5 QDomDocument クラスは DTD を解釈する。挙動を変更するフラグなどはなさそう。External entity (外部実体) 宣言および実体参照はサポートしない (XEE attack は効かない). Billion laughs attack もパースを打ち切るので効かない。
Poco::XML 名前空間. Node インタフェイスの getNodeByPath() メソッド, getNodeByPathNS() メソッドで simplified XPath expression をサポート。フルのXPath ではない.
POCO は openFrameworks の一部になっている。独立した多数のライブラリを組み合わせるより、調整されたフレームワークを使うのは、悪くない選択。
| Fedora 36 | Debian 11 | openSUSE 15.4 |
| poco-devel 1.11.2 | libpoco-dev 1.10.0 | poco-devel 1.10.1 |
ということで, 有力なものを以下に示す。後ろに選外も並べておく。
| 提供 | ライセンス |
|---|---|
| Saxonica社 | MPL 2.0 (Home Edition) |
HE (Home Edition), EE (Enterprise Edition) などがある。基本は Java, .NET 用で, それをC/C++向けにビルドしたもの。Saxon/C v1.2.1 は Saxon v9.9相当. SaxonC 11 はヴァージョン番号が Java版と同期. Saxon 10 product comparison (Feature Matrix)
唯一の XSLT 3.0, XQuery 3.1 and XPath 3.1 フルサポート. XInclude.
DTD (カタログのカスタマイズ可) and XML Schema 1.0/1.1 validation. XML Schema サポートは Saxon-EE のみ.
公式サイトで Linux, MacOS, Windows バイナリを提供。
| CentOS 8 | Fedora 34 | Debian | openSUSE 15.4 |
| パッケージなし | パッケージなし | libsaxonhe-java のみ (C版がない) | saxon8 (Java), saxon9 (Java) |
信頼できないソースのXMLデータを扱うときは, 次を false にする。
http://saxon.sf.net/feature/parserFeature?uri=http%3A//xml.org/sax/features/external-general-entities 外部一般実体
http://saxon.sf.net/feature/parserFeature?uri=http%3A//xml.org/sax/features/external-parameter-entities 外部パラメータ実体
| 提供 | ライセンス |
|---|---|
| Apache | Apache Software License 2.0 |
DOM Level 3 and SAX 1.0/2.0, XInclude. DTD および XML Schema. 各ディストリビューションでパッケージ化されている。
| CentOS 8 | Debian 11 | openSUSE 15.4 |
| xerces-c v3.2.2 | libxerces-c-dev v3.2.3 | libxerces-c-devel 3.2.3 |
Xerces-C は XPath を備えない。次と組み合わせる。XQuery & XPath 2.0 は XQilla のみ。しかし Debian 以外のディストリビューションでパッケージ化されていない. Xalan のほうがパッケージがあり, わずかにメンテナンスが続いている。
| CentOS 8 | Debian 11 | openSUSE 15.4 |
| xalan-c v1.12.0 | libxalan-c-dev v1.12 (2020) | libxalan-c-devel 1.11 (2014) |
| Fedora 34 | CentOS 7 | CentOS 8 | Debian 11 | openSUSE 15.4 |
| パッケージあり | パッケージあり | なし | libxqilla-dev v2.3.4 | なし. |
信頼できないソースのXMLデータを使うときは, DTDを完全に無効化する (fgDOMDisallowDoctype) か, 次のようにする.
XercesDOMParser は AbstractDOMParser から派生している。
XercesDOMParser *parser = new XercesDOMParser; parser->setCreateEntityReferenceNodes(true); // false のときに展開する. 紛らわしい. parser->setDisableDefaultEntityResolution(true);
SAXParser (SAX 1.0; 古い) も設定変更する.
SAXParser* parser = new SAXParser; parser->setDisableDefaultEntityResolution(true);
SAX2XMLReader (SAX2) はやり方が違う。デフォルト値は false になっている。
SAX2XMLReader* reader = XMLReaderFactory::createXMLReader(); parser->setFeature(XMLUni::fgXercesDisableDefaultEntityResolution, true);
| 提供 | ライセンス |
|---|---|
| Arseny Kapoulkine氏 | MIT License |
DTD or XML Schema 検証は含まない (non-validating のみ)。実体参照 entity reference のカスタマイズも不能。割り切った用途にはよい。
DOM-like interface. スピードが売り。Better than RapidXML. XPath 1.0. Full Unicode support.
| CentOS 8 | Debian 11 | openSUSE 15.4 |
| v1.11.4 | v1.11.4 | pugixml-devel 1.11.4 |
| 提供 | ライセンス |
|---|---|
| Daniel Veillard氏 | MIT License |
Plain Cだが、幅広く使われているので、挙げておく。
XPath 1.0. DTDのみサポートで XML Schema は未対応。
libxslt が libxml2 を使っている。Ruby Nokogiri requires libxml2 and libxslt.
| CentOS 8 | Debian 11 |
| libxml2 v2.9.7, libxslt v1.1.32 | libxslt1-dev v1.1.34 |
信頼できないソースのXML データを使うときは, options として次を指定しないようにする. DTDの無効化はできないかな?
XML_PARSE_DTDLOAD Load the external subset
XML_PARSE_NOENT Substitute entities
The Incredible C++ XML Parser and JSON Parser http://www.applied-mathematics.net/tools/IXMLParser.html XPath サポートあり。
Zorba - The NoSQL Query Processor http://www.zorba.io/home
XQuery C and C++ API, http://xqc.sourceforge.net/ APIを定めるプロジェクト。この XQC APIに基づくソフトウェアとして Zorba, XQilla がある。
"We replaced a rapidxml parser and not only is libstudxml much faster, but the code is so much clearer."
MIT License. XPath サポートなし。[2022-07] 最新版が2015年のv1.0.1. 終了.
もともとは James Clark 作 (v1.2まで). A stream-oriented XML parser library written in C. XPath サポートはなさそう。
CentOS 8 expat-2.2.5. v2.2.0 までは 外部 DTD サブセットの処理に脆弱性がある。[CVE-2017-9233 サンプル付き]
広く使われていて、現在でもメンテナンスされている。しかしながら, ライブラリを作るための基盤として使うもので、直接使うようなものではなさそう。
XML Vulnerabilities and Attacks cheatsheet XML脆弱性の一覧とサンプル.
XML Based Attacks - OWASP Server Side Request Forgery (SSRF) attack はリソースにアクセスしただけで発生。これはヤバい。
XML External Entity Prevention - OWASP Cheat Sheet Series 各実装での設定。
●●後で確認: REXML の脆弱性: #1104077 Round-trip instability in REXML, 1947526 - CVE-2021-28965 ruby: XML round-trip vulnerability in REXML