Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP XMLReader,获取版本和编码_Php_Xml_Xmlreader - Fatal编程技术网

PHP XMLReader,获取版本和编码

PHP XMLReader,获取版本和编码,php,xml,xmlreader,Php,Xml,Xmlreader,我目前正在重写一个PHP类,该类试图将XML文件分割成更小的块,以使用XMLReader和XMLWriter,而不是当前的基本文件系统和正则表达式方法 但是,我不知道如何从XML序言中获取版本、编码和独立标志 我的测试XML文件的开头如下所示: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE fakedoctype SYSTEM "fake_doc_type.dtd"> <!-- This is a comme

我目前正在重写一个PHP类,该类试图将XML文件分割成更小的块,以使用XMLReader和XMLWriter,而不是当前的基本文件系统和正则表达式方法

但是,我不知道如何从XML序言中获取版本、编码和独立标志

我的测试XML文件的开头如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fakedoctype SYSTEM "fake_doc_type.dtd">

 <!--
 This is a comment, it's here to try and get the parser to break in some way
 --> 

<root attribute="value" otherattribute="othervalue">

我可以用read()和next()等打开文档,但我似乎无法得到
中的任何内容。我能访问的第一件事就是伪造的DOCTYPE

我的测试代码如下:

$a = new XMLReader ();
var_dump ($a -> open ('/path/to/test/file.xml')) // true
var_dump ($a -> nodeType); // 0
var_dump ($a -> name); // ""
var_dump ($a -> readOuterXML ()); // ''
var_dump ($a -> read ()); // true
var_dump ($a -> nodeType); // 10
var_dump ($a -> readOuterXML ()); // <!DOCTYPE fakedoctype SYSTEM "fake_doc_type.dtd">
$a=newXMLReader();
var_dump($a->open('/path/to/test/file.xml'))//true
变量转储($a->nodeType);//0
变量转储($a->name);//""
var_dump($a->readOuterXML());/''
变量转储($a->read());//真的
变量转储($a->nodeType);//10
var_dump($a->readOuterXML());//
当然,我可以总是假设XML1.0,编码UTF8,standalone=yes,但是为了正确起见,我更希望能够获取源提要中的值,并在生成分割文件时使用它们


关于XMLReader和XMLwriter的文档似乎很差,所以我很有可能错过了文档中的某些内容。有人知道在这种情况下该怎么办吗

我从
XMLReader
中了解到,即使它有
XMLReader::XML_声明
常量,我在
XMLReader::$nodeType
属性中使用
XMLReader::read()
遍历文档时也从未体验过它

看起来它被跳过了,我还想知道为什么会这样,我还没有找到任何标志或选项来改变这种行为

对于输出,
XMLReader
始终返回UTF-8编码字符串。这与PHP中其他基于libxml的部分相同。所以从那一方面来说,一切都很清楚。但我假设这不是您感兴趣的部分,而是您使用
XMLReader::open()
打开的文件中的具体字符串输入

不是专门为
XMLReader
I创建的,它能够基于XML声明和BOM检测XML字符串的编码。我认为你应该两者都做。这是我认为您仍然需要使用正则表达式的一部分,但因为XML声明必须是第一件事,而且它是一个处理指令(PI),您应该能够在这里看到

这是
XMLRecoder
代码中的一些相关部分:

### excerpt from https://gist.github.com/hakre/5194634 

/**
 * pcre pattern to access EncodingDecl, see <http://www.w3.org/TR/REC-xml/#sec-prolog-dtd>
 */
const DECL_PATTERN = '(^<\?xml\s+version\s*=\s*(["\'])(1\.\d+)\1\s+encoding\s*=\s*(["\'])(((?!\3).)*)\3)';
const DECL_ENC_GROUP = 4;
const ENC_PATTERN = '(^[A-Za-z][A-Za-z0-9._-]*$)';

...

($result = preg_match(self::DECL_PATTERN, $buffer, $matches, PREG_OFFSET_CAPTURE))
    && $result = $matches[self::DECL_ENC_GROUP];
###摘自https://gist.github.com/hakre/5194634 
/**
*访问编码DECL的pcre模式,请参阅
*/

const DECL_PATTERN='(^是的,文档非常糟糕。我只找到非常一般的信息,“需要注意的是,libxml在内部使用UTF-8编码,因此,检索内容的编码将始终使用UTF-8编码。”-但无法检索有关原始文档的信息。如果没有其他解决方案,我可能会单独阅读文档的第一行,并使用RegExp手动解析该信息(如果重要)。考虑到所涉及的工作和回报,我认为最好假设UTF8。我一定会回到这个answ呃,如果这还不够的话。老实说,我刚才在XMLreader和XMLwriter方面遇到了比这更大的问题。:)与它们一起工作并不愉快。如果您使用的是
XMLreader
,我可以向您推荐一个我正在运行的项目,这个项目叫做XMLReader,它提供了关于XMLReader的良好接口,并解决了泛型编程(迭代器)的问题:还有一个正在运行的文件,可能会有帮助。另外,如果您能在这里将问题转化为更一般的问题,那就太好了,我们需要更多基于XMLReader的QA:)。我想说,我们真正能做的是在php.net上为XMLReader和XMLWriter编写适当的文档。:)这与其他文档的标准相差甚远。我没有错过那么多。您在这里指出的XML声明是我不太确定的事情之一,它永远不会作为
nodeType
返回。另一件可以更好地记录的事情是,它的含义是什么,因为它并不总是文本值。我认为XMLReader在这里的不同之处在于显著的空白。XMLReader在XML方面比其他LIB更具体,昨天在我的博客上刚刚链接到:
### excerpt from https://gist.github.com/hakre/5194634 

const BOM_UTF_8 = "\xEF\xBB\xBF";
const BOM_UTF_32LE = "\xFF\xFE\x00\x00";
const BOM_UTF_16LE = "\xFF\xFE";
const BOM_UTF_32BE = "\x00\x00\xFE\xFF";
const BOM_UTF_16BE = "\xFE\xFF";

...

/**
 * @param string $string string (recommended length 4 characters/octets)
 * @param string $default (optional) if none detected what to return
 * @return string Encoding, if it can not be detected defaults $default (NULL)
 * @throws InvalidArgumentException
 */
public function detectEncodingViaBom($string, $default = NULL)
{
    $len = strlen($string);

    if ($len > 4) {
        $string = substr($string, 0, 4);
    } elseif ($len < 4) {
        throw new InvalidArgumentException(sprintf("Need at least four characters, %d given.", $len));
    }

    switch (true) {
        case $string === self::BOM_UTF_16BE . $string[2] . $string[3]:
            return "UTF-16BE";

        case $string === self::BOM_UTF_8 . $string[3]:
            return "UTF-8";

        case $string === self::BOM_UTF_32LE:
            return "UTF-32LE";

        case $string === self::BOM_UTF_16LE . $string[2] . $string[3]:
            return "UTF-16LE";

        case $string === self::BOM_UTF_32BE:
            return "UTF-32BE";
    }

    return $default;
}