問題概要#
JSBSimが機体XMLを読み込む際に “XML parsing error: not well-formed” エラーが発生し、XMLファイルの読み込みに失敗します。
原因#
XML内の特殊文字(&、<、>)が正しくエスケープされていないことが原因です。
詳細な原因#
- 説明文での特殊文字使用:
<description>要素やコメント内に数式(例: “T/W > 0.1”)を含めた場合、<や>がXMLタグと誤認識される - アンパサンド
&の使用: “A & B"のような表現で&がエスケープされていない - タグの対応ミス: 開始タグ
<tag>に対する終了タグ</tag>がない
よくあるケース:
- コメントに
T/W > 0.1と書いて、>がタグの終了と解釈される - 説明文に
Speed & Altitudeと書いて、&がエンティティ参照の開始と解釈される - 数式をそのまま記載して、XML構文エラーになる
解決方法#
解決策1: 特殊文字をエスケープ#
間違った例:
<description>T/W > 0.1 & Speed < 20 m/s</description>正しい例:
<description>T/W > 0.1 & Speed < 20 m/s</description>エスケープ対応表#
| 特殊文字 | エスケープ表記 | 使用場所 |
|---|---|---|
& | & | すべて |
< | < | すべて |
> | > | すべて |
" | " | 属性値内 |
' | ' | 属性値内 |
使用例:
<!-- 数式の記載 -->
<description>Thrust-to-Weight ratio: T/W > 0.1</description>
<!-- 範囲の記載 -->
<description>Speed range: 10 < V < 30 m/s</description>
<!-- 複数条件の記載 -->
<description>Altitude > 100m & Speed < 20m/s</description>
<!-- 属性値内の引用符 -->
<property name="test"value"">123</property>解決策2: VSCode + XML拡張機能で構文チェック#
推奨拡張機能: Red Hat XML (VSCode)
設定方法:
- VSCodeで拡張機能「Red Hat XML」をインストール
- XMLファイルを開くと、自動的に構文チェックが実行される
- 保存時にエラーが表示される
利点:
- リアルタイムでエラー検出
- 問題箇所にカーソルを合わせると詳細説明が表示
- 自動フォーマット機能
解決策3: コマンドラインでの検証#
xmllintを使用(Linux/Mac):
xmllint --noout aircraft/RC_UAV_200g/RC_UAV_200g.xmlエラーがある場合、行番号と詳細が表示されます。
Pythonでの検証:
import xml.etree.ElementTree as ET
try:
tree = ET.parse('aircraft/RC_UAV_200g/RC_UAV_200g.xml')
print("✅ XML構文: 正常")
except ET.ParseError as e:
print(f"❌ XML構文エラー: {e}")
print(f" 行番号: {e.position[0]}, 列: {e.position[1]}")予防策#
1. XML生成スクリプトで自動エスケープ#
Pythonのxml.etree.ElementTreeを使用すると、特殊文字が自動的にエスケープされます。
推奨実装:
import xml.etree.ElementTree as ET
# ✅ 自動エスケープされる
description = ET.Element("description")
description.text = "T/W > 0.1 & Speed < 20 m/s" # 自動的に > & < に変換
# ❌ 手動で文字列連結する場合はエスケープ漏れの危険
xml_string = f"<description>{raw_text}</description>" # 危険2. Excelテンプレートに注意書きを追加#
説明欄に特殊文字使用禁止の注意書きを追加:
【注意】説明欄に以下の記号を使用しないでください:
- < > & " '
数式や比較演算子が必要な場合は、文章で記載してください。
例: "推力重量比は0.1より大きい" → OK
例: "T/W > 0.1" → NG(XMLエラーの原因)3. XML生成後の自動構文チェック#
XML生成後に自動的に構文チェックを実行:
def validate_xml(xml_path):
"""XML構文の検証"""
try:
ET.parse(xml_path)
print(f"✅ {xml_path}: XML構文正常")
return True
except ET.ParseError as e:
print(f"❌ {xml_path}: XML構文エラー")
print(f" エラー: {e}")
print(f" 行: {e.position[0]}, 列: {e.position[1]}")
return False
# XML生成直後に実行
xml_path = "aircraft/RC_UAV_200g/RC_UAV_200g.xml"
generate_jsbsim_xml(xml_path)
if not validate_xml(xml_path):
print("XML生成に失敗しました。内容を確認してください。")
exit(1)まとめ#
XML parsing error問題は、特殊文字のエスケープ忘れが原因です。
原因:
&、<、>がエスケープされていない- 説明文やコメント内に数式を直接記載
- XMLタグと誤認識される
解決策:
- 特殊文字をエスケープ表記に変換(
>,&,<) - VSCode + XML拡張機能で構文チェック
- xmllintやPythonで検証
予防策:
- XML生成スクリプトで自動エスケープ(
xml.etree.ElementTree使用) - Excelテンプレートに特殊文字使用禁止の注意書き
- XML生成後の自動構文チェックを実装
xml.etree.ElementTreeを使用することで、エスケープ忘れを防止できます。
関連記事#
- 【トラブル備忘】JSBSimが機体XMLを読み込めない - ディレクトリ構造の罠(記事E-4)
© 2025 Yaaasoh. All Rights Reserved.