XML/XPath: Difference between revisions

6,472 bytes added ,  2 years ago
m
→‎{{header|Phix}}: added syntax colouring the hard way
m (Corrected typo. Modified general comment.)
m (→‎{{header|Phix}}: added syntax colouring the hard way)
Line 2,847:
=={{header|Phix}}==
Phix has no direct support for XPath, but achieving the requirements using the standard xml_parse() is not exactly difficult.
<!--<lang Phix>include builtins/xml.e(phixonline)-->
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins</span><span style="color: #0000FF;">/</span><span style="color: #000000;">xml</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
constant xml_txt = """
<span style="color: #008080;">constant</span> <span style="color: #000000;">xml_txt</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
<inventory title="OmniCorp Store #45x10^3">
&lt;inventory title="OmniCorp Store #45x10^3"&gt;
<section name="health">
&lt;section name="health"&gt;
<item upc="123456789" stock="12">
&lt;item upc="123456789" stock="12"&gt;
<name>Invisibility Cream</name>
&lt;name&gt;Invisibility Cream&lt;/name&gt;
<price>14.50</price>
&lt;price&gt;14.50&lt;/price&gt;
<description>Makes you invisible</description>
&lt;description&gt;Makes you invisible&lt;/description&gt;
</item>
&lt;/item&gt;
<item upc="445322344" stock="18">
&lt;item upc="445322344" stock="18"&gt;
<name>Levitation Salve</name>
&lt;name&gt;Levitation Salve&lt;/name&gt;
<price>23.99</price>
&lt;price&gt;23.99&lt;/price&gt;
<description>Levitate yourself for up to 3 hours per application</description>
&lt;description&gt;Levitate yourself for up to 3 hours per application&lt;/description&gt;
</item>
&lt;/item&gt;
</section>
&lt;/section&gt;
<section name="food">
&lt;section name="food"&gt;
<item upc="485672034" stock="653">
&lt;item upc="485672034" stock="653"&gt;
<name>Blork and Freen Instameal</name>
&lt;name&gt;Blork and Freen Instameal&lt;/name&gt;
<price>4.95</price>
&lt;price&gt;4.95&lt;/price&gt;
<description>A tasty meal in a tablet; just add water</description>
&lt;description&gt;A tasty meal in a tablet; just add water&lt;/description&gt;
</item>
&lt;/item&gt;
<item upc="132957764" stock="44">
&lt;item upc="132957764" stock="44"&gt;
<name>Grob winglets</name>
&lt;name&gt;Grob winglets&lt;/name&gt;
<price>3.56</price>
&lt;price&gt;3.56&lt;/price&gt;
<description>Tender winglets of Grob. Just add water</description>
&lt;description&gt;Tender winglets of Grob. Just add water&lt;/description&gt;
</item>
&lt;/item&gt;
</section>
&lt;/section&gt;
</inventory>
&lt;/inventory&gt;
""",
"""</span><span style="color: #0000FF;">,</span>
-- or, of course, xml_txt = get_text("input.xml")
<span style="color: #000080;font-style:italic;">-- or, of course, xml_txt = get_text("input.xml")</span>
xml = xml_parse(xml_txt)
<span style="color: #000000;">xml</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">xml_parse</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xml_txt</span><span style="color: #0000FF;">)</span>
 
sequence sections = xml_get_nodes(xml[XML_CONTENTS],"section"),
<span style="color: #004080;">sequence</span> <span style="color: #000000;">sections</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">xml_get_nodes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xml</span><span style="color: #0000FF;">[</span><span style="color: #000000;">XML_CONTENTS</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"section"</span><span style="color: #0000FF;">),</span>
item1 = {},
<span style="color: #000000;">item1</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{},</span>
prices = {},
<span style="color: #000000;">prices</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{},</span>
names = {}
<span style="color: #000000;">names</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
 
for s=1 to length(sections) do
<span style="color: #008080;">for</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sections</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
sequence items = xml_get_nodes(sections[s],"item")
<span style="color: #004080;">sequence</span> <span style="color: #000000;">items</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">xml_get_nodes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sections</span><span style="color: #0000FF;">[</span><span style="color: #000000;">s</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"item"</span><span style="color: #0000FF;">)</span>
if item1={} then item1 = items[1] end if
<span style="color: #008080;">if</span> <span style="color: #000000;">item1</span><span style="color: #0000FF;">={}</span> <span style="color: #008080;">then</span> <span style="color: #000000;">item1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">items</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
for i=1 to length(items) do
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">items</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
prices = append(prices,xml_get_nodes(items[i],"price")[1][XML_CONTENTS])
<span style="color: #000000;">prices</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">prices</span><span style="color: #0000FF;">,</span><span style="color: #000000;">xml_get_nodes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">items</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"price"</span><span style="color: #0000FF;">)[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">XML_CONTENTS</span><span style="color: #0000FF;">])</span>
names = append(names,xml_get_nodes(items[i],"name")[1][XML_CONTENTS])
<span style="color: #000000;">names</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">names</span><span style="color: #0000FF;">,</span><span style="color: #000000;">xml_get_nodes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">items</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"name"</span><span style="color: #0000FF;">)[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">XML_CONTENTS</span><span style="color: #0000FF;">])</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
 
puts(1,"===item[1]===\n")
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"===item[1]===\n"</span><span style="color: #0000FF;">)</span>
sequence tmp = xml_new_doc(item1)
<span style="color: #004080;">sequence</span> <span style="color: #000000;">tmp</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">xml_new_doc</span><span style="color: #0000FF;">(</span><span style="color: #000000;">item1</span><span style="color: #0000FF;">)</span>
puts(1,xml_sprint(tmp))
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">xml_sprint</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tmp</span><span style="color: #0000FF;">))</span>
puts(1,"===prices===\n")
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"===prices===\n"</span><span style="color: #0000FF;">)</span>
pp(prices)
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">prices</span><span style="color: #0000FF;">)</span>
puts(1,"===names===\n")
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"===names===\n"</span><span style="color: #0000FF;">)</span>
pp(names,{pp_Maxlen,90})</lang>
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">names</span><span style="color: #0000FF;">,{</span><span style="color: #004600;">pp_Maxlen</span><span style="color: #0000FF;">,</span><span style="color: #000000;">90</span><span style="color: #0000FF;">})</span>
<!--</lang>-->
{{out}}
<pre>
7,794

edits