⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 faq.html

📁 perl教程
💻 HTML
📖 第 1 页 / 共 3 页
字号:
  3_Storable.t
  4_MemShare.t
  5_MemCopy.t</pre>
<p>The test suite is designed to exercise the boundary conditions of all
XML::Simple's functionality and these three scripts exercise the caching
functions.  If XML::Simple is asked to parse a file for which it has a cached
copy of a previous parse, then it compares the timestamp on the XML file with
the timestamp on the cached copy.  If the cached copy is *newer* then it will
be used.  If the cached copy is older or the same age then the file is
re-parsed.  The test scripts will get confused by networked filesystems if
the workstation and server system clocks are not synchronised (to the
second).</p>
<p>If you get an error in one of these three test scripts but you don't plan to
use the caching options (they're not enabled by default), then go right ahead
and run 'make install'.  If you do plan to use caching, then try unpacking
the distribution on local disk and doing the build/test there.</p>
<p>It's probably not a good idea to use the caching options with networked
filesystems in production.  If the file server's clock is ahead of the local
clock, XML::Simple will re-parse files when it could have used the cached
copy.  However if the local clock is ahead of the file server clock and a
file is changed immediately after it is cached, the old cached copy will be
used.</p>
<p>Is one of the three test scripts (above) failing but you're not running on
a network filesystem?  Are you running Win32?  If so, you may be seeing a bug
in Win32 where writes to a file do not affect its modfication timestamp.</p>
<p>If none of these scenarios match your situation, please confirm you're
running the latest version of XML::Simple and then email the output of
'make test' to me at <a href="mailto:grantm@cpan.org">grantm@cpan.org</a></p>
<p>
</p>
<h2><a name="why_is_xml__simple_so_slow">Why is XML::Simple so slow?</a></h2>
<p>If you find that XML::Simple is very slow reading XML, the most likely reason
is that you have XML::SAX installed but no additional SAX parser module.  The
XML::SAX distribution includes an XML parser written entirely in Perl.  This is
very portable but not very fast.  For better performance install either
XML::SAX::Expat or XML::LibXML.</p>
<p>
</p>
<hr />
<h1><a name="usage">Usage</a></h1>
<p>
</p>
<h2><a name="how_do_i_use_xml__simple">How do I use XML::Simple?</a></h2>
<p>If you had an XML document called /etc/appconfig/foo.xml you could 'slurp' it
into a simple data structure (typically a hashref) with these lines of code:</p>
<pre>
  <span class="keyword">use</span> <span class="variable">XML::Simple</span><span class="operator">;</span>
</pre>
<pre>
  <span class="keyword">my</span> <span class="variable">$config</span> <span class="operator">=</span> <span class="variable">XMLin</span><span class="operator">(</span><span class="string">'/etc/appconfig/foo.xml'</span><span class="operator">);</span>
</pre>
<p>The <code>XMLin()</code> function accepts options after the filename.</p>
<p>
</p>
<h2><a name="there_are_so_many_options__which_ones_do_i_really_need_to_know_about">There are so many options, which ones do I really need to know about?</a></h2>
<p>Although you can get by without using any options, you shouldn't even
consider using XML::Simple in production until you know what these two
options do:</p>
<ul>
<li>
<p>forcearray</p>
</li>
<li>
<p>keyattr</p>
</li>
</ul>
<p>The reason you really need to read about them is because the default values
for these options will trip you up if you don't.  Although everyone agrees
that these defaults are not ideal, there is not wide agreement on what they
should be changed to.  The answer therefore is to read about them (see below)
and select values which are right for you.</p>
<p>
</p>
<h2><a name="what_is_the_forcearray_option_all_about">What is the forcearray option all about?</a></h2>
<p>Consider this XML in a file called ./person.xml:</p>
<pre>
  &lt;person&gt;
    &lt;first_name&gt;Joe&lt;/first_name&gt;
    &lt;last_name&gt;Bloggs&lt;/last_name&gt;
    &lt;hobbie&gt;bungy jumping&lt;/hobbie&gt;
    &lt;hobbie&gt;sky diving&lt;/hobbie&gt;
    &lt;hobbie&gt;knitting&lt;/hobbie&gt;
  &lt;/person&gt;</pre>
<p>You could read it in with this line:</p>
<pre>
  <span class="keyword">my</span> <span class="variable">$person</span> <span class="operator">=</span> <span class="variable">XMLin</span><span class="operator">(</span><span class="string">'./person.xml'</span><span class="operator">);</span>
</pre>
<p>Which would give you a data structure like this:</p>
<pre>
  <span class="variable">$person</span> <span class="operator">=</span> <span class="operator">{</span>
    <span class="string">'first_name'</span> <span class="operator">=&gt;</span> <span class="string">'Joe'</span><span class="operator">,</span>
    <span class="string">'last_name'</span>  <span class="operator">=&gt;</span> <span class="string">'Bloggs'</span><span class="operator">,</span>
    <span class="string">'hobbie'</span>     <span class="operator">=&gt;</span> <span class="operator">[</span> <span class="string">'bungy jumping'</span><span class="operator">,</span> <span class="string">'sky diving'</span><span class="operator">,</span> <span class="string">'knitting'</span> <span class="operator">]</span>
  <span class="operator">}</span><span class="operator">;</span>
</pre>
<p>The &lt;first_name&gt; and &lt;last_name&gt; elements are represented as
simple scalar values which you could refer to like this:</p>
<pre>
  <span class="keyword">print</span> <span class="string">"$person-&gt;{first_name} $person-&gt;{last_name}\n"</span><span class="operator">;</span>
</pre>
<p>The &lt;hobbie&gt; elements are represented as an array - since there is
more than one.  You could refer to the first one like this:</p>
<pre>
  <span class="keyword">print</span> <span class="variable">$person</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">hobbie</span><span class="operator">}</span><span class="operator">-&gt;</span><span class="operator">[</span><span class="number">0</span><span class="operator">]</span><span class="operator">,</span> <span class="string">"\n"</span><span class="operator">;</span>
</pre>
<p>Or the whole lot like this:</p>
<pre>
  <span class="keyword">print</span> <span class="keyword">join</span><span class="operator">(</span><span class="string">', '</span><span class="operator">,</span> <span class="variable">@</span><span class="operator">{</span><span class="variable">$person</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">hobbie</span><span class="operator">}}</span> <span class="operator">),</span> <span class="string">"\n"</span><span class="operator">;</span>
</pre>
<p>The catch is, that these last two lines of code will only work for people
who have more than one hobbie.  If there is only one &lt;hobbie&gt;
element, it will be represented as a simple scalar (just like
&lt;first_name&gt; and &lt;last_name&gt;).  Which might lead you to write
code like this:</p>
<pre>
  <span class="keyword">if</span><span class="operator">(</span><span class="keyword">ref</span><span class="operator">(</span><span class="variable">$person</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">hobbie</span><span class="operator">}</span><span class="operator">))</span> <span class="operator">{</span>
    <span class="keyword">print</span> <span class="keyword">join</span><span class="operator">(</span><span class="string">', '</span><span class="operator">,</span> <span class="variable">@</span><span class="operator">{</span><span class="variable">$person</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">hobbie</span><span class="operator">}}</span> <span class="operator">),</span> <span class="string">"\n"</span><span class="operator">;</span>
  <span class="operator">}</span>
  <span class="keyword">else</span> <span class="operator">{</span>
    <span class="keyword">print</span> <span class="variable">$person</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">hobbie</span><span class="operator">}</span><span class="operator">,</span> <span class="string">"\n"</span><span class="operator">;</span>
  <span class="operator">}</span>
</pre>
<p>Don't do that.</p>
<p>One alternative approach is to set the forcearray option to a true value:</p>
<pre>
  <span class="keyword">my</span> <span class="variable">$person</span> <span class="operator">=</span> <span class="variable">XMLin</span><span class="operator">(</span><span class="string">'./person.xml'</span><span class="operator">,</span> <span class="string">forcearray</span> <span class="operator">=&gt;</span> <span class="number">1</span><span class="operator">);</span>
</pre>
<p>Which will give you a data structure like this:</p>
<pre>
  <span class="variable">$person</span> <span class="operator">=</span> <span class="operator">{</span>
    <span class="string">'first_name'</span> <span class="operator">=&gt;</span> <span class="operator">[</span> <span class="string">'Joe'</span> <span class="operator">]</span><span class="operator">,</span>
    <span class="string">'last_name'</span>  <span class="operator">=&gt;</span> <span class="operator">[</span> <span class="string">'Bloggs'</span> <span class="operator">]</span><span class="operator">,</span>
    <span class="string">'hobbie'</span>     <span class="operator">=&gt;</span> <span class="operator">[</span> <span class="string">'bungy jumping'</span><span class="operator">,</span> <span class="string">'sky diving'</span><span class="operator">,</span> <span class="string">'knitting'</span> <span class="operator">]</span>
  <span class="operator">}</span><span class="operator">;</span>
</pre>
<p>Then you can use this line to refer to all the list of hobbies even if there
was only one:</p>
<pre>
  <span class="keyword">print</span> <span class="keyword">join</span><span class="operator">(</span><span class="string">', '</span><span class="operator">,</span> <span class="variable">@</span><span class="operator">{</span><span class="variable">$person</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">hobbie</span><span class="operator">}}</span> <span class="operator">),</span> <span class="string">"\n"</span><span class="operator">;</span>
</pre>
<p>The downside of this approach is that the &lt;first_name&gt; and
&lt;last_name&gt; elements will also always be represented as arrays even
though there will never be more than one:</p>
<pre>
  <span class="keyword">print</span> <span class="string">"$person-&gt;{first_name}-&gt;[0] $person-&gt;{last_name}-&gt;[0]\n"</span><span class="operator">;</span>
</pre>
<p>This might be OK if you change the XML to use attributes for things that
will always be singular and nested elements for things that may be plural:</p>
<pre>
  &lt;person first_name=&quot;Jane&quot; last_name=&quot;Bloggs&quot;&gt;
    &lt;hobbie&gt;motorcycle maintenance&lt;/hobbie&gt;
  &lt;/person&gt;</pre>
<p>On the other hand, if you prefer not to use attributes, then you could
specify that any &lt;hobbie&gt; elements should always be represented as
arrays and all other nested elements should be simple scalar values unless
there is more than one:</p>
<pre>
  <span class="keyword">my</span> <span class="variable">$person</span> <span class="operator">=</span> <span class="variable">XMLin</span><span class="operator">(</span><span class="string">'./person.xml'</span><span class="operator">,</span> <span class="string">forcearray</span> <span class="operator">=&gt;</span> <span class="operator">[</span> <span class="string">'hobbie'</span> <span class="operator">]</span><span class="operator">);</span>
</pre>
<p>The forcearray option accepts a list of element names which should always
be forced to an array representation:</p>
<pre>
  forcearray =&gt; [ qw(hobbie qualification childs_name) ]</pre>
<p>See the XML::Simple manual page for more information.</p>
<p>
</p>
<h2><a name="what_is_the_keyattr_option_all_about">What is the keyattr option all about?</a></h2>
<p>Consider this sample XML:</p>
<pre>
  &lt;catalog&gt;
    &lt;part partnum=&quot;1842334&quot; desc=&quot;High pressure flange&quot; price=&quot;24.50&quot; /&gt;
    &lt;part partnum=&quot;9344675&quot; desc=&quot;Threaded gasket&quot;      price=&quot;9.25&quot; /&gt;
    &lt;part partnum=&quot;5634896&quot; desc=&quot;Low voltage washer&quot;   price=&quot;12.00&quot; /&gt;
  &lt;/catalog&gt;</pre>
<p>You could slurp it in with this code:</p>
<pre>
  <span class="keyword">my</span> <span class="variable">$catalog</span> <span class="operator">=</span> <span class="variable">XMLin</span><span class="operator">(</span><span class="string">'./catalog.xml'</span><span class="operator">);</span>
</pre>
<p>Which would return a data structure like this:</p>
<pre>
  <span class="variable">$catalog</span> <span class="operator">=</span> <span class="operator">{</span>
      <span class="string">'part'</span> <span class="operator">=&gt;</span> <span class="operator">[</span>
          <span class="operator">{</span>
            <span class="string">'partnum'</span> <span class="operator">=&gt;</span> <span class="string">'1842334'</span><span class="operator">,</span>
            <span class="string">'desc'</span>    <span class="operator">=&gt;</span> <span class="string">'High pressure flange'</span><span class="operator">,</span>
            <span class="string">'price'</span>   <span class="operator">=&gt;</span> <span class="string">'24.50'</span>
          <span class="operator">}</span><span class="operator">,</span>
          <span class="operator">{</span>
            <span class="string">'partnum'</span> <span class="operator">=&gt;</span> <span class="string">'9344675'</span><span class="operator">,</span>
            <span class="string">'desc'</span>    <span class="operator">=&gt;</span> <span class="string">'Threaded gasket'</span><span class="operator">,</span>
            <span class="string">'price'</span>   <span class="operator">=&gt;</span> <span class="string">'9.25'</span>
          <span class="operator">}</span><span class="operator">,</span>
          <span class="operator">{</span>
            <span class="string">'partnum'</span> <span class="operator">=&gt;</span> <span class="string">'5634896'</span><span class="operator">,</span>
            <span class="string">'desc'</span>    <span class="operator">=&gt;</span> <span class="string">'Low voltage washer'</span><span class="operator">,</span>
            <span class="string">'price'</span>   <span class="operator">=&gt;</span> <span class="string">'12.00'</span>
          <span class="operator">}</span>
      <span class="operator">]</span>
  <span class="operator">}</span><span class="operator">;</span>
</pre>
<p>Then you could access the description of the first part in the catalog
with this code:</p>
<pre>
  <span class="keyword">print</span> <span class="variable">$catalog</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">part</span><span class="operator">}</span><span class="operator">-&gt;</span><span class="operator">[</span><span class="number">0</span><span class="operator">]</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">desc</span><span class="operator">}</span><span class="operator">,</span> <span class="string">"\n"</span><span class="operator">;</span>
</pre>
<p>However, if you wanted to access the description of the part with the
part number of &quot;9344675&quot; then you'd have to code a loop like this:</p>
<pre>
  <span class="keyword">foreach</span> <span class="keyword">my</span> <span class="variable">$part</span> <span class="operator">(</span><span class="variable">@</span><span class="operator">{</span><span class="variable">$catalog</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">part</span><span class="operator">}}</span><span class="operator">)</span> <span class="operator">{</span>
    <span class="keyword">if</span><span class="operator">(</span><span class="variable">$part</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">partnum</span><span class="operator">}</span> <span class="keyword">eq</span> <span class="string">'9344675'</span><span class="operator">)</span> <span class="operator">{</span>
      <span class="keyword">print</span> <span class="variable">$part</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">desc</span><span class="operator">}</span><span class="operator">,</span> <span class="string">"\n"</span><span class="operator">;</span>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -