You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio中XML基于DTD验证失败,请求定位错误原因

XML与DTD验证失败问题排查

环境

  • 系统:Windows 12
  • 开发工具:Visual Studio 2022(社区版)

我尝试在Visual Studio中基于DTD验证XML文件,但验证失败,需要找出问题所在。

XML文件(sample.xml)

<?xml version="1.0"?>
<!DOCTYPE cXML SYSTEM "sample.dtd">
<cXML payloadID="123456789" timestamp="2025-08-05T10:00:00">
  <Header>
    <From>
      <Credential domain="NetworkID" identity="buyer123"/>
    </From>
    <To>
      <Credential domain="DUNS" identity="supplier456"/>
    </To>
    <Sender>
      <Credential domain="User" identity="sender789"/>
      <UserAgent>My CXML Client</UserAgent>
    </Sender>
  </Header>
  <Request deploymentMode="production">
    <OrderRequest>
      <OrderRequestHeader orderID="ORD1001"/>
      <ItemOut quantity="5" lineNumber="1"/>
    </OrderRequest>
  </Request>
</cXML>

DTD文件内容(原错误版本)

<?xml version="1.0"?>
<!DOCTYPE cXML [
  <!ELEMENT cXML (Header, Request)>
  <!ATTLIST cXML payloadID CDATA #REQUIRED>
  <!ATTLIST cXML timestamp CDATA #REQUIRED>

  <!ELEMENT Header (From, To, Sender)>
  <!ELEMENT From (Credential)>
  <!ELEMENT To (Credential)>
  <!ELEMENT Sender (Credential, UserAgent)>
  <!ELEMENT Credential EMPTY>
  <!ATTLIST Credential domain CDATA #REQUIRED>
  <!ATTLIST Credential identity CDATA #REQUIRED>

  <!ELEMENT UserAgent (#PCDATA)>

  <!ELEMENT Request (OrderRequest)>
  <!ATTLIST Request deploymentMode CDATA #REQUIRED>

  <!ELEMENT OrderRequest (OrderRequestHeader, ItemOut)>
  <!ELEMENT OrderRequestHeader EMPTY>
  <!ATTLIST OrderRequestHeader orderID CDATA #REQUIRED>

  <!ELEMENT ItemOut EMPTY>
  <!ATTLIST ItemOut quantity CDATA #REQUIRED>
  <!ATTLIST ItemOut lineNumber CDATA #REQUIRED>
]>

错误信息

验证错误截图

预期与实际结果

  • 预期:XML结构与DTD定义匹配,验证应通过
  • 实际:验证失败

问题原因与修复方案

核心问题

你的DTD文件存在两个格式错误:

  1. 外部DTD不能包含<!DOCTYPE ...>包裹的内部子集结构:外部DTD文件只需直接定义元素、属性规则,不需要用<!DOCTYPE cXML [...]>包裹内容。
  2. DTD不是XML文件,不需要XML声明:开头的<?xml version="1.0"?>是多余的,会导致解析错误。

修复后的DTD文件(sample.dtd)

<!ELEMENT cXML (Header, Request)>
<!ATTLIST cXML payloadID CDATA #REQUIRED>
<!ATTLIST cXML timestamp CDATA #REQUIRED>

<!ELEMENT Header (From, To, Sender)>
<!ELEMENT From (Credential)>
<!ELEMENT To (Credential)>
<!ELEMENT Sender (Credential, UserAgent)>
<!ELEMENT Credential EMPTY>
<!ATTLIST Credential domain CDATA #REQUIRED>
<!ATTLIST Credential identity CDATA #REQUIRED>

<!ELEMENT UserAgent (#PCDATA)>

<!ELEMENT Request (OrderRequest)>
<!ATTLIST Request deploymentMode CDATA #REQUIRED>

<!ELEMENT OrderRequest (OrderRequestHeader, ItemOut)>
<!ELEMENT OrderRequestHeader EMPTY>
<!ATTLIST OrderRequestHeader orderID CDATA #REQUIRED>

<!ELEMENT ItemOut EMPTY>
<!ATTLIST ItemOut quantity CDATA #REQUIRED>
<!ATTLIST ItemOut lineNumber CDATA #REQUIRED>

额外注意事项

确保sample.dtd与sample.xml处于同一目录,保证Visual Studio能正确加载到DTD文件。修改后重新执行验证,即可通过。


内容的提问来源于stack exchange,提问作者user2354396

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 13:25:07