<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Historias de un Geek &#187; Xml</title>
	<atom:link href="http://albertein.com.mx/archives/tag/xml/feed" rel="self" type="application/rss+xml" />
	<link>http://albertein.com.mx</link>
	<description>AlbertEin - Desvarios de una mente perturbada</description>
	<lastBuildDate>Wed, 30 Nov 2011 16:12:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>¿No sabes XPath? ¡Aprende!</title>
		<link>http://albertein.com.mx/archives/14</link>
		<comments>http://albertein.com.mx/archives/14#comments</comments>
		<pubDate>Tue, 11 Dec 2007 20:34:09 +0000</pubDate>
		<dc:creator>AlbertEin</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[aprende]]></category>
		<category><![CDATA[Xml]]></category>
		<category><![CDATA[xpath]]></category>

		<guid isPermaLink="false">http://albertein.gamersla.net/%c2%bfno-sabes-xpath-%c2%a1aprende</guid>
		<description><![CDATA[Otra de las herramientas de un desarrollador que se vuelven completamente imprescindibles una ves que las conoces es XPath. XPath es un estándar del W3C para realizar querys a documentos Xml, haciendo fácil filtrar los nodos de un documento de acuerdo a la estructura y atributos de los nodos. Si no usamos XPath, tendríamos que [...]]]></description>
			<content:encoded><![CDATA[<p>Otra de las herramientas de un desarrollador que se vuelven completamente imprescindibles una ves que las conoces es XPath.</p>
<p><a href="http://www.w3.org/TR/xpath">XPath</a> es un estándar del <a href="http://www.w3.org">W3C</a> para realizar querys a documentos Xml, haciendo fácil filtrar los nodos de un documento de acuerdo a la estructura y atributos de los nodos.</p>
<p>Si no usamos XPath, tendríamos que iterar a través de todos los nodos de un documento Xml para obtener la información que buscamos.</p>
<p>Para no hacérsela mas larga voy a dejar que el código hable por si mismo.</p>
<p>Imaginen que tienen el siguiente Xml:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span> 
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Sucursales<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Sucursal</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Matriz&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Articulo</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Monitor&quot;</span> <span style="color: #000066;">precio</span>=<span style="color: #ff0000;">&quot;1500&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Articulo</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Impresora&quot;</span> <span style="color: #000066;">precio</span>=<span style="color: #ff0000;">&quot;400&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Sucursal<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Sucursal</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Mayoreo&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Articulo</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Monitor&quot;</span> <span style="color: #000066;">precio</span>=<span style="color: #ff0000;">&quot;1600&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Articulo</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Impresora&quot;</span> <span style="color: #000066;">precio</span>=<span style="color: #ff0000;">&quot;500&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Sucursal<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Sucursal</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Menudeo&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Articulo</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Monitor&quot;</span> <span style="color: #000066;">precio</span>=<span style="color: #ff0000;">&quot;1800&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Articulo</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Impresora&quot;</span> <span style="color: #000066;">precio</span>=<span style="color: #ff0000;">&quot;700&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Sucursal<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Sucursales<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Y ustedes quieren saber tres cosas:</p>
<ol>
<li>¿Que artículos con que precios se encuentran en la sucursal Matriz?</li>
<li>¿Que sucursales tienen monitores?</li>
<li>¿Que precio tiene una impresora en la sucursal menudeo?</li>
</ol>
<p>Sin XPath estas tres simples preguntas se convierte en esta monstruosidad:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Xml</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #6666cc; font-weight: bold;">class</span> Program
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        XmlDocument document <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> XmlDocument<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        document<span style="color: #008000;">.</span><span style="color: #0000FF;">Load</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Test.xml&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        XmlNode sucursales <span style="color: #008000;">=</span> document<span style="color: #008000;">.</span><span style="color: #0000FF;">ChildNodes</span><span style="color: #008000;">&#91;</span><span style="color: #FF0000;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">//Obtener los articulos de la sucursal matriz</span>
        XmlNodeList articulosMatriz<span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>XmlNode sucursal <span style="color: #0600FF; font-weight: bold;">in</span> sucursales<span style="color: #008000;">.</span><span style="color: #0000FF;">ChildNodes</span><span style="color: #008000;">&#41;</span>
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>sucursal<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span> <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;Sucursal&quot;</span><span style="color: #008000;">&#41;</span>
                <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>sucursal<span style="color: #008000;">.</span><span style="color: #0000FF;">Attributes</span><span style="color: #008000;">&#91;</span><span style="color: #666666;">&quot;name&quot;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Value</span> <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;Menudeo&quot;</span><span style="color: #008000;">&#41;</span>
                    articulosMatriz <span style="color: #008000;">=</span> sucursal<span style="color: #008000;">.</span><span style="color: #0000FF;">ChildNodes</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">//Obtener todas las sucursales que tienen monitores</span>
        List<span style="color: #008000;">&lt;</span>XmlNode<span style="color: #008000;">&gt;</span> sucursalesConMonitor <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>XmlNode<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>XmlNode sucursal <span style="color: #0600FF; font-weight: bold;">in</span> sucursales<span style="color: #008000;">.</span><span style="color: #0000FF;">ChildNodes</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>sucursal<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span> <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;Sucursal&quot;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>XmlNode articulo <span style="color: #0600FF; font-weight: bold;">in</span> sucursal<span style="color: #008000;">.</span><span style="color: #0000FF;">ChildNodes</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>articulo<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span> <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;Articulo&quot;</span><span style="color: #008000;">&#41;</span>
                    <span style="color: #008000;">&#123;</span>
                        <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>articulo<span style="color: #008000;">.</span><span style="color: #0000FF;">Attributes</span><span style="color: #008000;">&#91;</span><span style="color: #666666;">&quot;name&quot;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Value</span> <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;Monitor&quot;</span><span style="color: #008000;">&#41;</span>
                        <span style="color: #008000;">&#123;</span>
                            sucursalesConMonitor<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>sucursal<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                            <span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//Siguiente sucursal</span>
                        <span style="color: #008000;">&#125;</span>
                    <span style="color: #008000;">&#125;</span>
                <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">//Obtener el precio de una impresora en la sucursal menudeo</span>
        XmlNode impresoraSucursalMenudeo <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>XmlNode sucursal <span style="color: #0600FF; font-weight: bold;">in</span> sucursales<span style="color: #008000;">.</span><span style="color: #0000FF;">ChildNodes</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>sucursal<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span> <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;Sucursal&quot;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>sucursal<span style="color: #008000;">.</span><span style="color: #0000FF;">Attributes</span><span style="color: #008000;">&#91;</span><span style="color: #666666;">&quot;name&quot;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Value</span> <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;Menudeo&quot;</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                    <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>XmlNode articulo <span style="color: #0600FF; font-weight: bold;">in</span> sucursal<span style="color: #008000;">.</span><span style="color: #0000FF;">ChildNodes</span><span style="color: #008000;">&#41;</span>
                    <span style="color: #008000;">&#123;</span>
                        <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>articulo<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span> <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;Articulo&quot;</span><span style="color: #008000;">&#41;</span>
                        <span style="color: #008000;">&#123;</span>
                            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>articulo<span style="color: #008000;">.</span><span style="color: #0000FF;">Attributes</span><span style="color: #008000;">&#91;</span><span style="color: #666666;">&quot;name&quot;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Value</span> <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;Impresora&quot;</span><span style="color: #008000;">&#41;</span>
                            <span style="color: #008000;">&#123;</span>
                                impresoraSucursalMenudeo <span style="color: #008000;">=</span> articulo<span style="color: #008000;">;</span>
                                <span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span> 
                            <span style="color: #008000;">&#125;</span>
                        <span style="color: #008000;">&#125;</span>
                    <span style="color: #008000;">&#125;</span>
&nbsp;
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>impresoraSucursalMenudeo <span style="color: #008000;">!=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span>
                        <span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//Se encontro el articulo, terminamos!</span>
                <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p><strong>¡HORRIBLE!</strong></p>
<p>Claro que si hicieron la tarea y saben XPath, ¡las cosas cambian dramáticamente!:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Xml</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #6666cc; font-weight: bold;">class</span> Program
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #6666cc; font-weight: bold;">string</span> xPathQuery<span style="color: #008000;">;</span>
        XmlDocument document <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> XmlDocument<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        document<span style="color: #008000;">.</span><span style="color: #0000FF;">Load</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Test.xml&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">//Obtener los articulos de la sucursal matriz</span>
        xPathQuery <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;/Sucursales/Sucursal[@name='Matriz']/Articulo&quot;</span><span style="color: #008000;">;</span>
        XmlNodeList nodes <span style="color: #008000;">=</span> document<span style="color: #008000;">.</span><span style="color: #0000FF;">SelectNodes</span><span style="color: #008000;">&#40;</span>xPathQuery<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">//Obtener todas las sucursales que tienen monitores</span>
        xPathQuery <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;/Sucursales/Sucursal[./Articulo[@name='Monitor']]&quot;</span><span style="color: #008000;">;</span>
        nodes <span style="color: #008000;">=</span> document<span style="color: #008000;">.</span><span style="color: #0000FF;">SelectNodes</span><span style="color: #008000;">&#40;</span>xPathQuery<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">//Obtener el precio de una impresora en la sucursal menudeo</span>
        xPathQuery <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;/Sucursales/Sucursal[@name='Menudeo']/Articulo[@name='Impresora']&quot;</span><span style="color: #008000;">;</span>
        XmlNode node <span style="color: #008000;">=</span> document<span style="color: #008000;">.</span><span style="color: #0000FF;">SelectSingleNode</span><span style="color: #008000;">&#40;</span>xPathQuery<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p><strong>SIMPLE, SENCILLO Y HERMOSO</strong></p>
<p>Si no saben nada al respecto lean por lo menos <a href="http://www.w3schools.com/xpath/">este tutorial de w3schools</a>, no se arrepentirán.</p>
<p><strong>P.S XPath es un estándar, por lo que no depende de .NET, puedes usarlo en Java, Python o lo que te de tu gana</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://albertein.com.mx/archives/14/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

