标签: dtd

在单元测试中验证XML的最佳方法是什么?

我有一个类,它有一个ToString生成XML 的方法.我想对它进行单元测试,以确保它生成有效的xml.我有一个DTD来验证XML.

我应该在单元测试中将DTD作为字符串包含在内以避免依赖它,还是有更聪明的方法来做到这一点?

xml language-agnostic dtd unit-testing

9
推荐指数
2
解决办法
5517
查看次数

XML属性可以有空格吗?

我正在为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'时出错....

xml dtd

9
推荐指数
1
解决办法
2万
查看次数

多模块Java/Maven项目中DBUnit的XML DTD路径?

我有一个多模块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中解决的".

有什么好办法解决这个问题?

xml dbunit dtd maven-2

9
推荐指数
1
解决办法
4069
查看次数

关于html5 dtd/schema的另一个问题

如果没有DTD或模式来验证H5文档,我们应该如何进行文档验证?通过文档验证,我的意思是"我们应该如何确保我们的html5文档在语法上准确且结构合理?" 请帮忙!如果我们无法准确验证HTML5文档,这对我们的行业来说将成为一个巨大的问题!

当然,W3C有一个在线工具可以验证各个页面.但是,如果我正在创建大量页面(数百,比方说)并且我想以某种批处理模式验证它们,那么确保有效结构和语法的可接受方法是什么?我的意思是,仅仅查看文档并说"是的,这是一个有效的xml文档"似乎相当简陋.自定义标签怎么样?标签属性怎么样?好像W3C在这里稍微偏冷了我们.

也许最好的答案可以在HTML编辑器中找到.但是你得到了DTD /模式碎片.每个编辑器供应商都会提出自己的有效结构.

也许答案是"等待HTML5成为官方".但我真的不能等待.我现在需要开始创建和验证内容.我有想要发布的应用程序,只能用html5完成.

那么,有什么想法吗?

schema html5 dtd

9
推荐指数
1
解决办法
3896
查看次数

如何在没有严格元素顺序的情况下定义DTD?

作为XML"noob",我在创建针对DTD验证的XML流/文件时发现了元素顺序的重要性.是否可以定义不依赖于元素的DTD?如果,那么请提供语法示例.

xml dtd

9
推荐指数
2
解决办法
7002
查看次数

如何使用PHP加速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大小.

php xml dtd xml-validation

9
推荐指数
1
解决办法
222
查看次数

如何使用DOM 3级序列化API生成DOCTYPE声明?

我有一个从头开始创建的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声明,但我无法找到生成它的方法.

我能怎么做?

java serialization dom dtd

8
推荐指数
1
解决办法
9096
查看次数

只能有两个文本值之一的元素?

我正在构建一个有fuel_system元素的DTD .

我想限制<fuel_system>标签之间的文字.它必须只是carburetedfuel-injected.我怎样才能做到这一点?

我没有提到类似这样的东西=>属性类型(化油器,燃油喷射),因为我想在<fuel_system>标签中强制使用此规则,而不是属性fuel_system.

xml dtd

8
推荐指数
2
解决办法
6179
查看次数

如何为不同目的使用相同的元素名称(在XML和DTD中)?

我想为此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)

你可以看到,该元素namecourse包含纯文本,但该元素namestudent复杂类型(第一姓,名).以下是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架构更改元素名称的情况下为此情况制定解决方案.

谢谢.

xml xsd dtd

8
推荐指数
1
解决办法
3518
查看次数

如何在Ruby中解析DTD文件

我试图将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标记语言)的一步.其中涉及的步骤包括:

  • 将HTML转换为有效的XHTML
  • 将正文转换为en-note元素
  • 根据dtd文件删除无效标记和属性
  • 针对dtd验证enml文件

我目前正在考虑从" 理解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并删除/清理有问题的元素和属性. …

ruby xml dtd nokogiri evernote

8
推荐指数
1
解决办法
1465
查看次数