[英]XML validation against given DTD in PHP
在PHP中,我試圖使用我的應用程序指定的DTD來驗證XML文檔 - 而不是通過外部獲取的XML文檔。 DOMDocument類中的validate方法似乎只使用XML文檔本身指定的DTD進行驗證,因此這不起作用。
可以這樣做,以及如何或者我必須將我的DTD轉換為XML模式,以便我可以使用schemaValidate方法?
(這似乎是在Validate XML中使用PHP中的自定義DTD但沒有正確答案的問題,因為解決方案僅依賴於目標XML指定的DTD)
注意: XML驗證可能受到Billion Laughs攻擊以及類似的DoS向量的影響。
這基本上就是rojoca在評論中提到的:
<?php
$xml = <<<END
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo SYSTEM "foo.dtd">
<foo>
<bar>baz</bar>
</foo>
END;
$root = 'foo';
$old = new DOMDocument;
$old->loadXML($xml);
$creator = new DOMImplementation;
$doctype = $creator->createDocumentType($root, null, 'bar.dtd');
$new = $creator->createDocument(null, null, $doctype);
$new->encoding = "utf-8";
$oldNode = $old->getElementsByTagName($root)->item(0);
$newNode = $new->importNode($oldNode, true);
$new->appendChild($newNode);
$new->validate();
?>
這將針對bar.dtd
驗證文檔。
你不能只調用$new->loadXML()
,因為這只會將DTD設置為原始,並且DOMDocument對象的doctype
屬性是只讀的,所以你必須復制根節點(包含所有內容)它)到一個新的DOM文檔。
我自己只是對此有所了解,所以我不完全確定這是否涵蓋了所有內容,但它絕對適用於我的示例中的XML。
當然,快速而骯臟的解決方案是首先將XML作為字符串獲取,使用您自己的DTD搜索並替換原始DTD,然后加載它。
我認為這只適用於XSD,請參閱:
http://php.net/manual/en/domdocument.schemavalidate#62032
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.