簡體   English   中英

針對PHP中給定DTD的XML驗證

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM