如何在解析文档时强制SAX解析器(特别是Java中的Xerces)在输入文档中没有任何 doctype的情况下使用DTD ?这甚至可能吗?
以下是我的方案的更多细节:
我们有一堆XML文档符合由多个不同系统生成的相同DTD(我无法更改).其中一些系统会在其输出文档中添加doctype,而其他系统则不会.有些使用命名字符实体,有些则不使用.有些使用命名字符实体而不声明doctype. 我知道这不是犹太人,但这是我必须要合作的.
我正在研究需要用Java解析这些文件的系统.目前,它通过首先将XML文档作为流读取,尝试检测是否已定义doctype,并添加doctype声明(如果尚未存在)来处理上述情况.问题是这个代码是错误的,我想用更干净的东西替换它.
文件很大,所以我不能使用基于DOM的解决方案.我也在尝试解析字符实体,因此使用XML Schema 没有帮助.
如果您有解决方案,请直接发布而不是链接到它?如果将来有一个带有死链接的正确解决方案,它不会做很好的Stack Overflow.
在PHP中,我试图使用我的应用程序指定的DTD来验证XML文档 - 而不是通过外部获取的XML文档.DOMDocument类中的validate方法似乎只使用XML文档本身指定的DTD进行验证,因此这不起作用.
可以这样做,以及如何或者我必须将我的DTD转换为XML模式,以便我可以使用schemaValidate方法?
(这似乎是在Validate XML中使用PHP中的自定义DTD但没有正确答案的问题,因为解决方案仅依赖于目标XML指定的DTD)
我正在尝试对xhtml文档进行xpath查询.使用.NET 3.5.
该文件如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
....
</head>
<body>
...
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
因为文档包含各种char实体( 等等),所以我需要使用DTD,以便使用XmlReader加载它.所以我的代码看起来像这样:
var s = File.OpenRead(fileToRead)
var reader = XmlReader.Create(s, new XmlReaderSettings{ ProhibitDtd=false });
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,它会返回
打开外部DTD'http: //www.w3.org/TR/xhtml1-transitional.dtd '时发生错误:远程服务器返回错误:(503)服务器不可用.
现在,我知道为什么我得到503错误. W3C非常清楚地解释了这一点.
我见过"解决方法",人们只是禁用DTD.这是ProhibitDtd=true可以做的,它消除了503错误.
但在我的情况下导致其他问题 - 应用程序没有获得实体定义,因此不是格式良好的XML.如何在不访问w3.org网站的情况下验证DTD并获取实体定义?
我认为.NET 4.0有一个漂亮的内置功能来处理这种情况:XmlPreloadedResolver.但我需要.NET 3.5的解决方案.
我有以下java代码:
DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc=db.parse(new File("/opt/myfile"));
并/opt/myfile包含以下内容:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE archive SYSTEM "../../schema/xml/schema.dtd"> ...
我收到以下错误:
java.io.FileNotFoundException: /../schema/xml/schema.dtd (No such file or directory)
这是一个大型java框架,它使用其他地方生成的XML文件.我认为相对路径是问题所在.我不认为在JVM启动之前更改cwd是可以接受的(路径来自JVM本身读取的配置文件),并且我没有找到在JVM运行时更改cwd的方法.如何使用适当的DTD解析此XML文件?
关于我的另一个问题:XML反序列化null元素?
我从第三方服务器获得这些元素用于API测试:
<Taxable />
<DefaultPurchasePrice />
Run Code Online (Sandbox Code Playgroud)
我刚刚意识到,现在我自己也在混淆自己这样的元素是否代表空对象或空.
谈论对象,它们是一样的,null对象通常意味着空对象引用对吗?但是尝试将XML元素映射到数据字段/值,它们可能是不同的,即空字符串是空字符串,但对于十进制价格或布尔值,它们是未定义的,等于空,但不会为空,除非定义它们可以为空.
同样,我的XmlSerializer的问题是无法处理像这样的空元素.我可以在我的代码中轻松修复它.或者我应该问人们提供的XML有一个定义良好的XML吗?因为看起来像这样的空XML元素是未定义的:它在这里,但是对于XML元素本身可能是null还是空无关紧要?但是对于那个元素,我的代码需要弄清楚如何处理它,除非我将所有的C#类数据字段设置为字符串类型.否则,如果我的代码试图直接将空或空XML元素映射到某个数据字段,它肯定会失败.
我不得不问这个问题,因为我遇到XML有很多这些元素,对于那些特殊元素,我的.NET XML序列化代码需要将这些字段映射为字符串,如果字符串不为空,我将它们视为对应的数据类型,否则我将它们设置为null.在我进行反序列化之前,我最终删除了那些空元素,因为它更容易.但我徘徊:"我在代码中真正做了什么?我只是删除了空元素或空元素吗?因为它们明显不同!但是编写XML的人认为它们是相同的,因为XML本身没有概念'null',有些人认为我有责任决定它是null还是空.但XML确实能让你以更清晰的方式表示'null'元素
编辑:
在我提供的示例中,这两个元素显然应该是null而不是空元素.XML实际上没有null的概念,但是这些元素可以省略(如果它们是null,不要将它们放入XML中),或者使用更好的表示,如@svick所述.或者在其他情况下,应该在有意义时使用空元素.但不适用于Decimal或Boolean.
许多工具为单元测试报告生成并使用相同的XML文件格式.
示例(来源):
<?xml version="1.0" encoding="UTF-8" ?>
<testsuite errors="0" failures="0" hostname="hazelnut.osuosl.org" name="net.cars.engine.MoteurTest" tests="6" time="0.021" timestamp="2007-11-02T23:13:50">
<properties>
<property name="java.vendor" value="IBM Corporation" />
<property name="os.name" value="Linux" />
<!-- more property tags-->
</properties>
<testcase classname="net.cars.engine.MoteurTest" name="hasBougie" time="0.0010" />
<testcase classname="net.cars.engine.MoteurTest" name="hasCarburatueur" time="0.0010" />
<!-- more testcase tags-->
<system-out><![CDATA[]]></system-out>
<system-err><![CDATA[]]></system-err>
</testsuite>
Run Code Online (Sandbox Code Playgroud)
经过一番研究后,我发现该格式是由apache基础(由ant项目提出)提出的.
由...生产:
消费者:
我能找到的唯一文件是ant wiki上的这个页面: Proposals/EnhancedTestReports
是否有这种格式的规范(DTD,XSD)?
我想从手写一个这样的文件...(或者如果你知道的话,可以使用librairy)......
我有以下javascript:
var orderItemQuantity = $('<input/>', {
type: 'hidden',
name: 'order_detail[][quantity]',
value: itemQuantity
});
Run Code Online (Sandbox Code Playgroud)
上面的javascript引发以下错误消息:
Error: SyntaxError: DOM Exception 12
Run Code Online (Sandbox Code Playgroud)
这个工作没有错误:
var newListItem = $('<li/>', {
html:
$('#item_name_'+itemId).text() +
'(' + $('#item_quantity_' + itemId).val() +')' +
'<a onclick="removeItem(' + itemId + ')">Delete this</a>' +
'<input type="hidden" name="order_detail[][item_id]" value="' + itemId + '"/>',
id: itemId
});
Run Code Online (Sandbox Code Playgroud)
我检查了以下问题,但答案没有明确说明正确的原因为什么.
这是我的DTD:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Run Code Online (Sandbox Code Playgroud)
问题:为什么$('<input/>')并且$('<input>')抛出所述异常而$('<li/>')不是问题?
我是 XML 新手,正在使用 XML 工具插件在 Notepad ++ 上通过 DTD 验证测试简单的 XML。
但是,每当我尝试验证文件时,我都会收到 DTD 被禁止的信息。请参阅下面的我尝试运行的示例。
<?xml version="1.0"?>
<!DOCTYPE root[
DTD is prohibited. <---------------error message I get on Notepad ++
<!ELEMENT root (dept*, staff*)>
<!ELEMENT dept (#PCDATA)>
<!ELEMENT staff (staff | name)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST dept id ID #REQUIRED>
<!ATTLIST staff id ID #REQUIRED dept IDREF #IMPLIED>
]>
<root>
<dept id="i1">it</dept>
<dept id="i2">law</dept>
<staff id="s3">
<name>steve</name>
</staff>
<staff id="s2" dept="i1">
<name>jerry</name>
</staff>
<staff id="s4" dept="i2">
<staff id="s5">
<name>peter</name>
</staff>
</staff>
</root> …Run Code Online (Sandbox Code Playgroud) 我有一个类,它有一个ToString生成XML 的方法.我想对它进行单元测试,以确保它生成有效的xml.我有一个DTD来验证XML.
我应该在单元测试中将DTD作为字符串包含在内以避免依赖它,还是有更聪明的方法来做到这一点?
我正在为xml文档创建一个DTD.我有一个xml元素的Enumerated属性.我的问题是:属性Type是否有空格?
例如:
<!ELEMENT Link (#PCDATA)>
<!ATTLIST Link Type (Amendment|Reference|Superseded|Modified|
Corrigendum|Corresponds|Endorsement|Equivalent|Identical|Modified|
Not Equivalent|Note taken of|Related|Similar) "Reference">
Run Code Online (Sandbox Code Playgroud)
所以我想要的是:
<Link Type="Not Equivalent" \>
Run Code Online (Sandbox Code Playgroud)
但这似乎是barf.
我需要为空间做一些神奇的伏都教吗?还是只是运气不好?
谢谢!
更新
对不起 - 当我说barf时,我的意思是当我尝试验证文档时(例如在Web浏览器中打开它),我收到一条错误消息:在ATTLIST枚举中找到无效字符.处理资源'file:/// C:/myxmldocument.xml'时出错....
dtd ×10
xml ×8
java ×2
unit-testing ×2
xsd ×2
.net ×1
doctype ×1
dom ×1
javascript ×1
jquery ×1
notepad++ ×1
null ×1
php ×1
report ×1
sax ×1
syntax-error ×1
validation ×1
w3c ×1
xerces ×1
xhtml ×1