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 “奇异的”@名称空间;以及XML文档中的样式信息_Php_Xml_Parsing_Simplexml_Tidy - Fatal编程技术网

Php “奇异的”@名称空间;以及XML文档中的样式信息

Php “奇异的”@名称空间;以及XML文档中的样式信息,php,xml,parsing,simplexml,tidy,Php,Xml,Parsing,Simplexml,Tidy,我得到的XML文档如下所示: <?xml version="1.0" encoding="UTF-8"?> @namespace html url(http://www.w3.org/1999/xhtml); :root { font:small Verdana; font-wei.... huge list of styling <items> <item> ... @命名空间html url(http://www.w3.org/1999

我得到的XML文档如下所示:

<?xml version="1.0" encoding="UTF-8"?>
@namespace html url(http://www.w3.org/1999/xhtml); :root { font:small Verdana; font-wei.... huge list of styling
<items>
    <item>
    ...

@命名空间html url(http://www.w3.org/1999/xhtml); :根{font:small Verdana;font-wei….样式的巨大列表
...
第二行似乎阻止我解析文件

使用整洁的
true,
“输出xml”=>true,
‘wrap’=>false);
$tidy=新的tidy;
$tidy->parseFile('https://website.com/path/to/XML.ashx?param=12345“,$config);
$tidy->cleanRepair();
印刷费($tidy);
?>
这将导致:

tidy Object
(
    [errorBuffer] => 
    [value] => <?xml version="1.0" encoding="utf-8"?>

)
tidy对象
(
[errorBuffer]=>
[值]=>
)
使用simplexml_加载_文件()

输出:

**Warning**: simplexml_load_file(): https://website.com/path/to/XML.ashx?param=12345:1: parser error : Start tag expected, '<' not found in **C:\xampp\htdocs\local\php\script.php** on line 2

**Warning**: simplexml_load_file(): <?xml version="1.0" encoding="utf-8" ?> in **C:\xampp\htdocs\local\php\script.php** on line 2

**Warning**: simplexml_load_file(): ^ in **C:\xampp\htdocs\local\php\script.php** on line 2
**警告**:simplexml\u load\u file():https://website.com/path/to/XML.ashx?param=12345:1: 解析器错误:应为开始标记,“它不是XML,而是XHTML(),下面声明的是html名称空间,后面是CSS样式。因此,您的浏览器可以理解它,但XML解析器无法理解

@namespace html url(w3.org/1999/xhtml); 
它是HTML,意味着与XML兼容,但是看起来此页面可能不符合严格的XHTML,因此不能作为XML进行解析。

之后。因此,您拥有的是无效的XML,这是库告诉您的。但是Tidy(2009年3月25日发布)可以解决这一问题:

$buffer = '<?xml version="1.0" encoding="UTF-8"?>
@namespace html url(http://www.w3.org/1999/xhtml); :root { font:small Verdana; font-wei.... huge list of styling
<items>
    <item></item> </items>';

$config = array(
    'indent'     => true,
    'input-xml'  => true,
    'output-xml' => true,
    'wrap'       => false);
$tidy = new tidy;
$tidy->parseString($buffer, $config);
$tidy->cleanRepair();

print_r($tidy);
$buffer=”
@命名空间html url(http://www.w3.org/1999/xhtml);:root{font:small Verdana;font-wei….样式的巨大列表
';
$config=array(
“缩进”=>true,
“输入xml”=>true,
“输出xml”=>true,
‘wrap’=>false);
$tidy=新的tidy;
$tidy->parseString($buffer,$config);
$tidy->cleanRepair();
印刷费($tidy);
输出:

tidy Object
(
    [errorBuffer] => line 2 column 1 - Warning: discarding unexpected plain text
    [value] => <?xml version="1.0" encoding="utf-8"?>
<items>
  <item></item>
</items>
)
tidy对象
(
[errorBuffer]=>第2行第1列-警告:丢弃意外的纯文本
[值]=>
)
因此,您很可能对“XML”有更多的问题(或者,如果您有一个非常非常大的行,那么这是一个缓冲区的限制)

由于这不是XML,您可能会问自己这是什么?它是CSS,您拥有的是所谓的更具体的a。(浏览器(用户代理)根据早期的CSS规范,CSS不必支持任何这些。即使是当前的CSS选择器API也需要任何名称空间前缀解析,以在API中引发异常。中提供了一个CSS名称空间与XML(XHTML)文档一起使用的好例子

文本块中接下来的内容是名称空间前缀及其下的CSS

因此,您所拥有的是不同数据的混合体。它不能作为XML进行有效解析,而且您也找不到任何能够处理CSS的通用浏览器——即使它可以验证——因为不清楚该文本是否为CSS(它需要包装在表示样式表的元素中)

旁注:一个正确的CSS解析器会在这里删除XML,因为它是无效的,CSS规范表示任何无效的东西都需要删除。因此,从整体上讲,您在那里拥有的东西在技术上可以与CSS文档一致。您认为它是XML,它只是CSS;)

所以,尽管这个@规则听起来很奇怪,但事实并非如此。它存在,只是不在这样一个地方


另一方面,用
website.com
来掩盖源代码并没有真正的帮助-看到真实的网站可能会给你更多的上下文来告诉你更多。

这很奇怪。普通XML中的所有内容都包装在一个标记中。我会去掉它,因为没有解析器会处理它。我不知道@stuff是什么;但XML不是。但是当我在浏览器中输入xml文档的url时,它会被很好地解析。它会说“此xml文件似乎没有任何与之关联的样式信息。文档树如下图所示。”然后显示xml(?)当我查看源代码时,没有@namespace或样式化junkDid,您的意思是用
}关闭XML第2行的修剪部分
closing brake?无论缺陷有多严重,浏览器都会疯狂地尝试用尖括号解析任何内容,因为如果他们不这样做,至少90%的您尝试访问的网站都会出现html错误屏幕。除了浏览器没有理由假设以
@namespace
标记开头的行除非它是在CSS上下文中,否则它是CSS。而一个名为
的根元素的文档肯定不是XHTML文档。
@namespace
声明和名称空间CSS选择器具有出色的浏览器支持。它在这里没有任何意义,因为它不会出现在浏览器需要的情况下尝试将其解析为CSS。在早期版本中,浏览器不需要支持它。在当前版本中,CSS选择器API不需要支持命名空间声明,即更改前缀以查询它。我不知道有哪种浏览器允许通过选择器API的前缀来声明命名空间。我称之为优秀的浏览器支持rt,但你可能知道得更清楚。另外,你链接到的文档之所以说它是草稿,是因为你链接到了编辑的草稿——这基本上是文档修订系统中的主干。CSS名称空间是W3C推荐的。你又错了,CSS规范写道美国不能支持名称空间er代理。不是说没有指定名称空间。我之前有你的链接,我会修复。选择器API不允许你声明名称空间的原因是选择器API不是CSS,而
@namespace
是CSS语法的一部分。如果你用CSS样式编写了包含名称空间声明和选择器的XHTML文档当然,您会发现任何浏览器,包括IE9+都可以很好地应用这些样式。
$buffer = '<?xml version="1.0" encoding="UTF-8"?>
@namespace html url(http://www.w3.org/1999/xhtml); :root { font:small Verdana; font-wei.... huge list of styling
<items>
    <item></item> </items>';

$config = array(
    'indent'     => true,
    'input-xml'  => true,
    'output-xml' => true,
    'wrap'       => false);
$tidy = new tidy;
$tidy->parseString($buffer, $config);
$tidy->cleanRepair();

print_r($tidy);
tidy Object
(
    [errorBuffer] => line 2 column 1 - Warning: discarding unexpected plain text
    [value] => <?xml version="1.0" encoding="utf-8"?>
<items>
  <item></item>
</items>
)