mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-18 05:26:57 +08:00
170 lines
18 KiB
HTML
170 lines
18 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||
<html>
|
||
<head>
|
||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||
<title>将 XML 数据解析到数组中</title>
|
||
</head>
|
||
<body class="docs"><div id="layout">
|
||
<div id="layout-content"><div id="function.xml-parse-into-struct" class="refentry">
|
||
<div class="refnamediv">
|
||
<h1 class="refname">xml_parse_into_struct</h1>
|
||
<p class="verinfo">(PHP 4, PHP 5, PHP 7)</p><p class="refpurpose"><span class="refname">xml_parse_into_struct</span> — <span class="dc-title">将 XML 数据解析到数组中</span></p>
|
||
|
||
</div>
|
||
<div class="refsect1 unknown-seealsp" id="refsect1-function.xml-parse-into-struct-unknown-seealsp">
|
||
<h3 class="title">说明</h3>
|
||
<div class="methodsynopsis dc-description">
|
||
<span class="methodname"><strong>xml_parse_into_struct</strong></span>
|
||
( <span class="methodparam"><span class="type">resource</span> <code class="parameter">$parser</code></span>
|
||
, <span class="methodparam"><span class="type">string</span> <code class="parameter">$data</code></span>
|
||
, <span class="methodparam"><span class="type">array</span> <code class="parameter reference">&$values</code></span>
|
||
[, <span class="methodparam"><span class="type">array</span> <code class="parameter reference">&$index</code></span>
|
||
] ) : <span class="type">int</span></div>
|
||
|
||
<p class="para rdfs-comment">
|
||
该函数将 XML 文件解析到两个对应的数组中,<code class="parameter">index</code>
|
||
参数含有指向 <code class="parameter">values</code>
|
||
数组中对应值的指针。最后两个数组参数可由指针传递给函数。
|
||
</p>
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<p class="para">
|
||
<span class="function"><strong>xml_parse_into_struct()</strong></span> 失败返回 0,成功返回
|
||
1。这和 <strong><code>FALSE</code></strong> 与
|
||
<strong><code>TRUE</code></strong> 不同,使用例如 === 的运算符时要注意。
|
||
</p>
|
||
</p></blockquote>
|
||
<p class="para">
|
||
以下范例显示了由该函数生成的数组的内部结构。我们简单地将一个
|
||
<em>note</em> 嵌入到一个 <em>para</em>
|
||
标记中,解析后我们可以打印出生成的数组的结构:
|
||
<div class="example" id="example-6603">
|
||
<p><strong>Example #1 <span class="function"><strong>xml_parse_into_struct()</strong></span> 示例</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><pre><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$simple </span><span style="color: #007700">= </span><span style="color: #DD0000">"<para><note>simple note</note></para>"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$p </span><span style="color: #007700">= </span><span style="color: #0000BB">xml_parser_create</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">xml_parse_into_struct</span><span style="color: #007700">(</span><span style="color: #0000BB">$p</span><span style="color: #007700">, </span><span style="color: #0000BB">$simple</span><span style="color: #007700">, </span><span style="color: #0000BB">$vals</span><span style="color: #007700">, </span><span style="color: #0000BB">$index</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">xml_parser_free</span><span style="color: #007700">(</span><span style="color: #0000BB">$p</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"Index array\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$index</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"\nVals array\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$vals</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</pre></div>
|
||
</div>
|
||
|
||
<div class="example-contents"><p>
|
||
运行以上代码,我们得到的输出将是:
|
||
</p></div>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
Index array
|
||
Array
|
||
(
|
||
[PARA] => Array
|
||
(
|
||
[0] => 0
|
||
[1] => 2
|
||
)
|
||
|
||
[NOTE] => Array
|
||
(
|
||
[0] => 1
|
||
)
|
||
|
||
)
|
||
|
||
Vals array
|
||
Array
|
||
(
|
||
[0] => Array
|
||
(
|
||
[tag] => PARA
|
||
[type] => open
|
||
[level] => 1
|
||
)
|
||
|
||
[1] => Array
|
||
(
|
||
[tag] => NOTE
|
||
[type] => complete
|
||
[level] => 2
|
||
[value] => simple note
|
||
)
|
||
|
||
[2] => Array
|
||
(
|
||
[tag] => PARA
|
||
[type] => close
|
||
[level] => 1
|
||
)
|
||
|
||
)
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</p>
|
||
<p class="para">
|
||
如果您的 XML 文档很复杂,基于该文档的事件处理(Event-driven)解析(基于 expat 扩展库)也会对应的变得复杂。该函数生成的并非 DOM 风格的对象,而是横向的树状结构。因此,我们能够方便的建立表达 XML 文件数据的对象。我们假设以下 XML 文件表示一个关于氨基酸信息的小型数据库:
|
||
<div class="example" id="example-6604">
|
||
<p><strong>Example #2 moldb.xml - 分子信息的小型数据库</strong></p>
|
||
<div class="example-contents">
|
||
<div class="xmlcode"><pre class="xmlcode"><?xml version="1.0"?>
|
||
<moldb>
|
||
|
||
<molecule>
|
||
<name>Alanine</name>
|
||
<symbol>ala</symbol>
|
||
<code>A</code>
|
||
<type>hydrophobic</type>
|
||
</molecule>
|
||
|
||
<molecule>
|
||
<name>Lysine</name>
|
||
<symbol>lys</symbol>
|
||
<code>K</code>
|
||
<type>charged</type>
|
||
</molecule>
|
||
|
||
</moldb></pre>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
以下是解析该文档并生成相应对象的代码:
|
||
<div class="example" id="example-6605">
|
||
<p><strong>Example #3
|
||
parsemoldb.php - 将 moldb.xml 解析到分子(molecular)对象的数组中
|
||
</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><pre><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">AminoAcid </span><span style="color: #007700">{<br /> var </span><span style="color: #0000BB">$name</span><span style="color: #007700">; </span><span style="color: #FF8000">// aa 姓名<br /> </span><span style="color: #007700">var </span><span style="color: #0000BB">$symbol</span><span style="color: #007700">; </span><span style="color: #FF8000">// 三字母符号<br /> </span><span style="color: #007700">var </span><span style="color: #0000BB">$code</span><span style="color: #007700">; </span><span style="color: #FF8000">// 单字母代码<br /> </span><span style="color: #007700">var </span><span style="color: #0000BB">$type</span><span style="color: #007700">; </span><span style="color: #FF8000">// hydrophobic, charged 或 neutral<br /><br /> </span><span style="color: #007700">function </span><span style="color: #0000BB">AminoAcid </span><span style="color: #007700">(</span><span style="color: #0000BB">$aa</span><span style="color: #007700">)<br /> {<br /> foreach (</span><span style="color: #0000BB">$aa </span><span style="color: #007700">as </span><span style="color: #0000BB">$k</span><span style="color: #007700">=></span><span style="color: #0000BB">$v</span><span style="color: #007700">)<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">$k </span><span style="color: #007700">= </span><span style="color: #0000BB">$aa</span><span style="color: #007700">[</span><span style="color: #0000BB">$k</span><span style="color: #007700">];<br /> }<br />}<br /><br />function </span><span style="color: #0000BB">readDatabase</span><span style="color: #007700">(</span><span style="color: #0000BB">$filename</span><span style="color: #007700">)<br />{<br /> </span><span style="color: #FF8000">// 读取 aminoacids 的 XML 数据<br /> </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">implode</span><span style="color: #007700">(</span><span style="color: #DD0000">""</span><span style="color: #007700">,</span><span style="color: #0000BB">file</span><span style="color: #007700">(</span><span style="color: #0000BB">$filename</span><span style="color: #007700">));<br /> </span><span style="color: #0000BB">$parser </span><span style="color: #007700">= </span><span style="color: #0000BB">xml_parser_create</span><span style="color: #007700">();<br /> </span><span style="color: #0000BB">xml_parser_set_option</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">XML_OPTION_CASE_FOLDING</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">xml_parser_set_option</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">XML_OPTION_SKIP_WHITE</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">xml_parse_into_struct</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">$values</span><span style="color: #007700">, </span><span style="color: #0000BB">$tags</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">xml_parser_free</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">);<br /><br /> </span><span style="color: #FF8000">// 遍历 XML 结构<br /> </span><span style="color: #007700">foreach (</span><span style="color: #0000BB">$tags </span><span style="color: #007700">as </span><span style="color: #0000BB">$key</span><span style="color: #007700">=></span><span style="color: #0000BB">$val</span><span style="color: #007700">) {<br /> if (</span><span style="color: #0000BB">$key </span><span style="color: #007700">== </span><span style="color: #DD0000">"molecule"</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$molranges </span><span style="color: #007700">= </span><span style="color: #0000BB">$val</span><span style="color: #007700">;<br /> </span><span style="color: #FF8000">// each contiguous pair of array entries are the<br /> // lower and upper range for each molecule definition<br /> </span><span style="color: #007700">for (</span><span style="color: #0000BB">$i</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">; </span><span style="color: #0000BB">$i </span><span style="color: #007700">< </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$molranges</span><span style="color: #007700">); </span><span style="color: #0000BB">$i</span><span style="color: #007700">+=</span><span style="color: #0000BB">2</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$offset </span><span style="color: #007700">= </span><span style="color: #0000BB">$molranges</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">] + </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$len </span><span style="color: #007700">= </span><span style="color: #0000BB">$molranges</span><span style="color: #007700">[</span><span style="color: #0000BB">$i </span><span style="color: #007700">+ </span><span style="color: #0000BB">1</span><span style="color: #007700">] - </span><span style="color: #0000BB">$offset</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$tdb</span><span style="color: #007700">[] = </span><span style="color: #0000BB">parseMol</span><span style="color: #007700">(</span><span style="color: #0000BB">array_slice</span><span style="color: #007700">(</span><span style="color: #0000BB">$values</span><span style="color: #007700">, </span><span style="color: #0000BB">$offset</span><span style="color: #007700">, </span><span style="color: #0000BB">$len</span><span style="color: #007700">));<br /> }<br /> } else {<br /> continue;<br /> }<br /> }<br /> return </span><span style="color: #0000BB">$tdb</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">parseMol</span><span style="color: #007700">(</span><span style="color: #0000BB">$mvalues</span><span style="color: #007700">)<br />{<br /> for (</span><span style="color: #0000BB">$i</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">; </span><span style="color: #0000BB">$i </span><span style="color: #007700">< </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$mvalues</span><span style="color: #007700">); </span><span style="color: #0000BB">$i</span><span style="color: #007700">++) {<br /> </span><span style="color: #0000BB">$mol</span><span style="color: #007700">[</span><span style="color: #0000BB">$mvalues</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">][</span><span style="color: #DD0000">"tag"</span><span style="color: #007700">]] = </span><span style="color: #0000BB">$mvalues</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">][</span><span style="color: #DD0000">"value"</span><span style="color: #007700">];<br /> }<br /> return new </span><span style="color: #0000BB">AminoAcid</span><span style="color: #007700">(</span><span style="color: #0000BB">$mol</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">$db </span><span style="color: #007700">= </span><span style="color: #0000BB">readDatabase</span><span style="color: #007700">(</span><span style="color: #DD0000">"moldb.xml"</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"** Database of AminoAcid objects:\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$db</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</pre></div>
|
||
</div>
|
||
|
||
</div>
|
||
在执行完 <var class="filename">parsemoldb.php</var> 后,变量 <var class="varname"><var class="varname">$db</var></var> 将包含有一个由 <strong class="classname">AminoAcid</strong> 对象组成的数组,该脚本的输出如下:
|
||
<div class="informalexample">
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
** Database of AminoAcid objects:
|
||
Array
|
||
(
|
||
[0] => aminoacid Object
|
||
(
|
||
[name] => Alanine
|
||
[symbol] => ala
|
||
[code] => A
|
||
[type] => hydrophobic
|
||
)
|
||
|
||
[1] => aminoacid Object
|
||
(
|
||
[name] => Lysine
|
||
[symbol] => lys
|
||
[code] => K
|
||
[type] => charged
|
||
)
|
||
|
||
)
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</p>
|
||
</div>
|
||
|
||
</div></div></div></body></html> |