この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:atom
更新日時:2026-06-11 07:07:02

タイトル: エンティティ" ... "への参照は';'デリミタで終了する必要があります。
SEOタイトル: 【Javaエラー】エンティティ" ... "への参照は';'デリミタで終了する必要があります。

この本文には実行可能なタグ等が含まれるため、安全のためHTMLソースとして表示しています。本文データは変更していません。

<table border="1" cellpadding="1" cellspacing="1" style="width:1000px">
	<thead><tr><th style="background-color:#f39c12;color:#ffffff;text-align:left">この記事の要点</th></tr></thead>
	<tbody><tr><td style="background-color:#fef9e7"><ul>
				<li><code>エンティティ "..." への参照は ";" デリミタで終了する必要があります</code> は<strong>XML / HTML / JSP で & 文字をエスケープしていない</strong></li>
				<li>原因: <code>&</code> はエンティティ参照の開始文字なので、文字として使うには <code>&amp;</code> にエスケープ必須</li>
				<li>対処: URL のクエリ区切り、SQL の AND 等で <code>&</code> をそのまま書いている箇所を <code>&amp;</code> に</li>
				<li>JSP / XML の場合は <code><c:out value="\${url}" /></code> で自動エスケープが安全</li>
			</ul></td></tr></tbody>
</table>

<p>&nbsp;</p>

<h2>エラーの状況</h2>
<pre style="background:#0f172a;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;font-family:Consolas,Monaco,monospace;font-size:0.9em;line-height:1.5"><code>XML エラー
エンティティ "page" への参照は ";" デリミタで終了する必要があります。

# または英語版
The reference to entity "page" must end with the ';' delimiter.</code></pre>


<p>XML パーサがエンティティ参照(<code>&...;</code>)を期待した位置で、<code>&</code> の後に文字が続いて <code>;</code> で終わらない、というエラー。HTML / JSP / XML / 設定ファイル等で発生します。</p>

<h2>原因</h2>
<pre style="background:#0f172a;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;font-family:Consolas,Monaco,monospace;font-size:0.9em;line-height:1.5"><code><!-- ダメな例 -->
<a href="/search?q=hello&page=2">  <!-- ← &page でエラー -->
<a href="/search?q=A&B">  <!-- ← &B でエラー -->

<p>結果: SELECT * FROM users WHERE active=true & deleted=false</p>  <!-- ← & でエラー --></code></pre>


<p>XML パーサは <code>&</code> を見つけると<strong>エンティティ参照の始まり</strong>と解釈します:</p>

<ul>
	<li><code>&amp;</code> → <code>&</code></li>
	<li><code>&lt;</code> → <code><</code></li>
	<li><code>&gt;</code> → <code>></code></li>
	<li><code>&quot;</code> → <code>"</code></li>
	<li><code>&#NNN;</code> → 数値文字参照</li>
</ul>

<p>これらの形式以外は不正と判定されてエラーになります。</p>

<h2>対処方法</h2>

<h3>方法 1: & を &amp; にエスケープ</h3>
<pre style="background:#0f172a;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;font-family:Consolas,Monaco,monospace;font-size:0.9em;line-height:1.5"><code><!-- 修正 -->
<a href="/search?q=hello&page=2">  <!-- & → & -->
<a href="/search?q=A&B">

<p>SELECT * FROM users WHERE active=true & deleted=false</p></code></pre>


<h3>方法 2: JSP の c:out で自動エスケープ</h3>
<pre style="background:#0f172a;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;font-family:Consolas,Monaco,monospace;font-size:0.9em;line-height:1.5"><code><!-- JSTL の c:out -->
<c:out value="${url}" />
<!-- 自動的に &, <, > がエスケープされる -->

<!-- EL 式 + c:out -->
<a href="<c:url value='/search'><c:param name='q' value='${query}'/><c:param name='page' value='${page}'/></c:url>">
    検索
</a></code></pre>


<h3>方法 3: CDATA セクション</h3>
<pre style="background:#0f172a;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;font-family:Consolas,Monaco,monospace;font-size:0.9em;line-height:1.5"><code><![CDATA[
    URL: /search?q=hello&page=2
    SQL: SELECT * WHERE a=1 & b=2
]]>
<!-- CDATA 内は XML パーサが特殊文字として解釈しない --></code></pre>


<h2>JSP での EL 式の自動エスケープ</h2>
<pre style="background:#0f172a;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;font-family:Consolas,Monaco,monospace;font-size:0.9em;line-height:1.5"><code><!-- JSP 2.0+ -->
<%@ page contentType="text/html;charset=UTF-8" %>

<!-- ${} は標準でエスケープ「されない」-->
<p>${userInput}</p>  <!-- ← XSS 危険、ユーザ入力にはサニタイズ必須 -->

<!-- c:out でエスケープ -->
<p><c:out value="${userInput}" /></p>

<!-- カスタムタグや JSTL fn:escapeXml -->
<p>${fn:escapeXml(userInput)}</p></code></pre>


<h2>HTML の & エスケープ</h2>

<p>HTML5 では「<code>&</code> + 既知のエンティティ名 + <code>;</code>」以外の <code>&</code> は<strong>そのまま許容される</strong>のでブラウザ表示は壊れません。しかし<strong>XML として処理する場面(XHTML / SVG / XML 出力)</strong>では厳格にエラーになります。</p>
<pre style="background:#0f172a;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;font-family:Consolas,Monaco,monospace;font-size:0.9em;line-height:1.5"><code><!-- HTML5 では許容 (ブラウザは寛容) -->
<a href="/search?q=A&B">  <!-- 動く -->

<!-- XHTML / XML では NG -->
<?xml version="1.0"?>
<a href="/search?q=A&B">  <!-- パースエラー -->

<!-- 安全な書き方 -->
<a href="/search?q=A&B"></code></pre>


<h2>サーバサイドでの自動エスケープ</h2>

<h3>Spring / Thymeleaf</h3>
<pre style="background:#0f172a;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;font-family:Consolas,Monaco,monospace;font-size:0.9em;line-height:1.5"><code><!-- 標準では自動エスケープ -->
<p th:text="${userInput}">プレースホルダ</p>
<!-- &, <, > が自動的にエスケープされる -->

<!-- エスケープしない場合(信頼できるソースのみ) -->
<p th:utext="${trustedHtml}">プレースホルダ</p></code></pre>


<h3>Laravel Blade</h3>
<pre style="background:#0f172a;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;font-family:Consolas,Monaco,monospace;font-size:0.9em;line-height:1.5"><code><!-- 自動エスケープ -->
<p>{{ $userInput }}</p>
<!-- &, <, > が自動エスケープ -->

<!-- エスケープなし(XSS 危険、信頼できるソースのみ) -->
<p>{!! $trustedHtml !!}</p></code></pre>


<h3>React / Vue</h3>
<pre style="background:#0f172a;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;font-family:Consolas,Monaco,monospace;font-size:0.9em;line-height:1.5"><code>// React は自動エスケープ
<p>{userInput}</p>  // &, <, > 自動エスケープ
<p dangerouslySetInnerHTML={{ __html: trustedHtml }} />  // 危険

// Vue
<p>{{ userInput }}</p>  // 自動エスケープ
<p v-html="trustedHtml"></p>  // 危険</code></pre>


<h2>設定ファイル(XML)でのエスケープ</h2>
<pre style="background:#0f172a;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;font-family:Consolas,Monaco,monospace;font-size:0.9em;line-height:1.5"><code><!-- web.xml, application.xml, pom.xml 等 -->
<param-value>http://example.com/?a=1&b=2</param-value>

<!-- JNDI 名等 -->
<resource-ref>
    <res-ref-name>jdbc/Pool&1</res-ref-name>
</resource-ref>

<!-- pom.xml のシステム properties -->
<properties>
    <my.url>https://example.com?a=1&b=2</my.url>
</properties></code></pre>


<h2>JSON では & はそのままで OK</h2>

<p>JSON は XML ではないので、<code>&</code> のエスケープは不要:</p>
<pre style="background:#0f172a;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;font-family:Consolas,Monaco,monospace;font-size:0.9em;line-height:1.5"><code>// JSON
{"url": "/search?q=hello&page=2"}  // OK

// ただし JSON を HTML に埋め込む際は HTML 側でエスケープが必要
<script>
const data = {"url": "&"};  // HTML 文脈でこれを書くと <script> タグの解釈が壊れる
</script></code></pre>


<h2>関連エラー</h2>

<ul>
	<li><code>The content of elements must consist of well-formed character data</code>: <code><</code> や <code>></code> をエスケープしていない</li>
	<li><code>XML document structures must start and end within the same entity</code>: タグ開閉不一致</li>
	<li><code>Premature end of file</code>: XML が途中で終わっている</li>
</ul>

<h2>関連記事</h2>

<ul>
	<li><a href="/article/21303">aリンクの貼り方と動的URLの作成</a></li>
</ul>