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文件存在两个格式错误:
- 外部DTD不能包含
<!DOCTYPE ...>包裹的内部子集结构:外部DTD文件只需直接定义元素、属性规则,不需要用<!DOCTYPE cXML [...]>包裹内容。 - 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
相关产品推荐
相关产品推荐

