問題概要#

JSBSimが機体XMLを読み込む際に “XML parsing error: not well-formed” エラーが発生し、XMLファイルの読み込みに失敗します。

原因#

XML内の特殊文字(&<>)が正しくエスケープされていないことが原因です。

詳細な原因#

  1. 説明文での特殊文字使用: <description>要素やコメント内に数式(例: “T/W > 0.1”)を含めた場合、<>がXMLタグと誤認識される
  2. アンパサンド&の使用: “A & B"のような表現で&がエスケープされていない
  3. タグの対応ミス: 開始タグ<tag>に対する終了タグ</tag>がない

よくあるケース:

  • コメントに T/W > 0.1 と書いて、>がタグの終了と解釈される
  • 説明文に Speed & Altitude と書いて、&がエンティティ参照の開始と解釈される
  • 数式をそのまま記載して、XML構文エラーになる

解決方法#

解決策1: 特殊文字をエスケープ#

間違った例:

<description>T/W > 0.1 & Speed < 20 m/s</description>

正しい例:

<description>T/W &gt; 0.1 &amp; Speed &lt; 20 m/s</description>

エスケープ対応表#

特殊文字エスケープ表記使用場所
&&amp;すべて
<&lt;すべて
>&gt;すべて
"&quot;属性値内
'&apos;属性値内

使用例:

<!-- 数式の記載 -->
<description>Thrust-to-Weight ratio: T/W &gt; 0.1</description>

<!-- 範囲の記載 -->
<description>Speed range: 10 &lt; V &lt; 30 m/s</description>

<!-- 複数条件の記載 -->
<description>Altitude &gt; 100m &amp; Speed &lt; 20m/s</description>

<!-- 属性値内の引用符 -->
<property name="test&quot;value&quot;">123</property>

解決策2: VSCode + XML拡張機能で構文チェック#

推奨拡張機能: Red Hat XML (VSCode)

設定方法:

  1. VSCodeで拡張機能「Red Hat XML」をインストール
  2. XMLファイルを開くと、自動的に構文チェックが実行される
  3. 保存時にエラーが表示される

利点:

  • リアルタイムでエラー検出
  • 問題箇所にカーソルを合わせると詳細説明が表示
  • 自動フォーマット機能

解決策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"  # 自動的に &gt; &amp; &lt; に変換

# ❌ 手動で文字列連結する場合はエスケープ漏れの危険
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タグと誤認識される

解決策:

  • 特殊文字をエスケープ表記に変換(&gt;, &amp;, &lt;
  • VSCode + XML拡張機能で構文チェック
  • xmllintやPythonで検証

予防策:

  • XML生成スクリプトで自動エスケープ(xml.etree.ElementTree使用)
  • Excelテンプレートに特殊文字使用禁止の注意書き
  • XML生成後の自動構文チェックを実装

xml.etree.ElementTreeを使用することで、エスケープ忘れを防止できます。


関連記事#

  • 【トラブル備忘】JSBSimが機体XMLを読み込めない - ディレクトリ構造の罠(記事E-4)

© 2025 Yaaasoh. All Rights Reserved.