我有一个类,它有一个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'时出错....
我有一个多模块maven项目.在persist模块中,我有许多引用DTD的XML文件数据文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE myapp-data SYSTEM "myapp-data.dtd" >
<dataset>
.....omitted for brevity....
</dataset>
Run Code Online (Sandbox Code Playgroud)
DTD与XML文件存储在同一目录中,甚至Eclipse也将这些XML文件报告为有效.
但是,当我运行应用程序时,DBUnit FlatXMLDataSet会抛出FileNotFound异常,因为它无法找到DTD.它显然在根项目目录中寻找DTD(例如myproject /).我原以为它会在与XML文件本身相同的目录中查找DTD(例如myproject/persist/target/test-data).
看看DBUnit的源代码,就可以说"相对DOCTYPE uri是从当前工作的dicrectory中解决的".
有什么好办法解决这个问题?
如果没有DTD或模式来验证H5文档,我们应该如何进行文档验证?通过文档验证,我的意思是"我们应该如何确保我们的html5文档在语法上准确且结构合理?" 请帮忙!如果我们无法准确验证HTML5文档,这对我们的行业来说将成为一个巨大的问题!
当然,W3C有一个在线工具可以验证各个页面.但是,如果我正在创建大量页面(数百,比方说)并且我想以某种批处理模式验证它们,那么确保有效结构和语法的可接受方法是什么?我的意思是,仅仅查看文档并说"是的,这是一个有效的xml文档"似乎相当简陋.自定义标签怎么样?标签属性怎么样?好像W3C在这里稍微偏冷了我们.
也许最好的答案可以在HTML编辑器中找到.但是你得到了DTD /模式碎片.每个编辑器供应商都会提出自己的有效结构.
也许答案是"等待HTML5成为官方".但我真的不能等待.我现在需要开始创建和验证内容.我有想要发布的应用程序,只能用html5完成.
那么,有什么想法吗?
作为XML"noob",我在创建针对DTD验证的XML流/文件时发现了元素顺序的重要性.是否可以定义不依赖于元素的DTD?如果,那么请提供语法示例.
我用我在本地的DTD文件来验证我的XML.
为此,我正在做:
$xml = $dmsMerrin.'/xml/'.$id.'/conversion.xml';
$dtd = $dmsMerrin.'/style_files/journalpublishing.dtd';
$dom = new DOMDocument();
@$dom->load($xml);
libxml_use_internal_errors(true);
if (@$dom->validate()) {
$htmlDTDError .= "<h2>No Errors Found - The tested file is Valid !</h2>";
}
else {
$errors = libxml_get_errors();
$htmlDTDError .= '<h2>Errors Found ('.count($errors).')</h2><ol>';
foreach ($errors as $error) {
$htmlDTDError .= '<li>'.$error->message.' on line '.$error->line. '</li>';
}
$htmlDTDError .= '</ol>';
libxml_clear_errors();
}
libxml_use_internal_errors(false);
Run Code Online (Sandbox Code Playgroud)
对于1600行的XML,这需要大约30秒.
这是平时吗?我认为应该快得多吗?
如您所见,我使用的DTD是本地服务器上的.
任何的想法?谢谢.
编辑:通过调试和检查执行时间,我注意到如果我的xml有1600行或150行,它需要相同的时间,所以问题不是xml大小.
我有一个从头开始创建的DOM文档,我需要将它序列化为输出流.我正在使用DOM 3级序列化API,如下例所示:
OutputStream out;
Document doc;
DOMImplementationLS domImplementation =
(DOMImplementationLS) DocumentBuilderFactory.newInstance().newDocumentBuilder().getDOMImplementation();
LSSerializer lsSerializer = domImplementation.createLSSerializer();
LSOutput lsOutput = domImplementation.createLSOutput();
lsOutput.setByteStream(out);
lsSerializer.write(doc, lsOutput);
Run Code Online (Sandbox Code Playgroud)
我需要在结果文档中包含一个包含公共和系统标识符的DOCTYPE声明,但我无法找到生成它的方法.
我能怎么做?
我正在构建一个有fuel_system元素的DTD .
我想限制<fuel_system>标签之间的文字.它必须只是carbureted或fuel-injected.我怎样才能做到这一点?
我没有提到类似这样的东西=>属性类型(化油器,燃油喷射),因为我想在<fuel_system>标签中强制使用此规则,而不是属性fuel_system.
我想为此xml文档创建DTD架构:
<root>
<student>
<name>
<firstname>S1</firstname>
<lastname>S2</lastname>
</name>
</student>
<course>
<name>CS101</name>
</course>
</root>
Run Code Online (Sandbox Code Playgroud)
你可以看到,该元素name在course包含纯文本,但该元素name的student复杂类型(第一姓,名).以下是DTD:
<!ELEMENT root (course|student)*>
<!ELEMENT student (name)>
<!ELEMENT name (lastname|firstname)>
<!ELEMENT firstname (#PCDATA)>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT course (name)>
Run Code Online (Sandbox Code Playgroud)
当我想验证它时,我得到一个错误,因为该课程的name结构与学生的结构不同name.
我的问题:
name使用DTD而不是xml架构更改元素名称的情况下为此情况制定解决方案.谢谢.
我试图将DTD文件转换为YAML文件,我尝试在libXML和Nokogiri中加载它,但似乎DTD文件不是有效的XML文件.只要我可以解析DTD文件,我就可以使用任何第三方宝石.
我尝试转换:
wget "http://xml.evernote.com/pub/enml2.dtd"
irb
require 'nokogiri'
xml = Nokogiri::XML::Document.parse('enml2.dtd')
xml.to_yaml
=> "--- !ruby/object:Nokogiri::XML::Document\ndecorators: \nnode_cache: []\nerrors:\n- !ruby/exception:Nokogiri::XML::SyntaxError\n message: |\n Start tag expected, '<' not found\n domain: 1\n code: 4\n level: 3\n file: \n line: 1\n str1: \n str2: \n str3: \n int1: 0\n column: 1\n"
Run Code Online (Sandbox Code Playgroud)
任何在线XML验证器也会返回错误"Start tag expected".我认为这是因为所有有效的XML文档都以<?xml,DTD文件似乎缺失.这就是我得出的结论,即所有DTD文件都是无效的XML文件,但是,XML定义语法本身没有被定义为有效的XML,这确实让人感到奇怪.为什么?
我正在解析DTD文件以从XML文件中删除无效属性,以了解要保留哪些属性以及要删除哪些属性,因此我需要一种方法来解析DTD文件.
最终,这只是尝试将HTML转换为ENML(Evernote标记语言)的一步.其中涉及的步骤包括:
我目前正在考虑从" 理解Evernote标记语言 "中复制不允许的属性和标记,并使用它来验证我的XHTML,但我更喜欢使用DTD作为我的源代码.
Nokogiri DTD类是一个Node类,用于保存内联DTD节点并对其进行验证.在我的例子中,我有一个使用SYSTEM属性指定的外部DTD文件,Nokogiri似乎不支持.即使它确实有效,我所得到的只是验证.
我确实使用以下方法验证了正常工作:
#dtd = XML::Dtd.new File.read Rails.root.join('lib', 'assets','enml2.dtd')
#enml_document = XML::Document.string enml
#ret = enml_document.validate dtd
Run Code Online (Sandbox Code Playgroud)
我还没试过REXML.我会给你一个回报并报告.
我正在尝试将HTML文档转换为使用给定DTD验证的XML文档.ENML模式中不允许使用大多数HTML元素和属性,因此我必须删除它们或删除它们.我还需要知道哪些属性是允许的,哪些不是,这样我就可以正确地解析XML并删除/清理有问题的元素和属性. …