Question

Des variantes de cette question ont été posée à plusieurs reprises maintenant, mais ma question est plus une question de l'efficacité générale de l'utilisation XPATH en Java.

Ma tâche: prendre des articles de wikipedia sur des zones géographiques et de créer une structure de données hiérarchique d'eux.

Je l'ai déjà obtenu des versions XML des pages wiki et reformaté selon un schéma qui est logique intuitive. Je l'ai également fait une série de classes très simples représentant différents niveaux de la hiérarchie administrative, comme ceci:

public class Province implements java.io.Serializable {

private ArrayList<City> cities = new ArrayList<City>();
private String hanzi;
private String pinyin;


public Province(String hanzi, String pinyin) {
this.hanzi = hanzi;
this.pinyin = pinyin;
}

En plus d'une méthode pour ajouter des villes, des méthodes getter et setter, et un toString ().

Voici un exemple du type de fichier XML que je traite:

<mediawiki>
     <page>
           <title>Tianjin</title>
           <revision>
                    <id>2064019</id>
                    <text xml:space="preserve">
                              <province>
                                       <hanzi>天津</hanzi>
                                       <pinyin>Tianjin</pinyin>

                                       <Level2>
                                               <hanzi>和平</hanzi>
                                               <pinyin>Heping</pinyin>
                                               <zip>300000</zip>
                                       </Level2>

                                       <Level2>
                                                <hanzi>河东</hanzi>
                                                <pinyin>Hedong</pinyin>
                                                <zip>300000</zip>
                                        </Level2>

                                </province>
                    </text>
            </revision>
      </page>

...

</mediawiki>

J'ai essentiellement une configuration fonctionnelle à ce stade, mais le code est extrêmement répétitif et ne tient pas compte de la nature hiérarchique inhérente des données géographiques. Idéalement, je pourrais arrêter à un certain niveau (disons « se concentrer » sur une province), et seulement se référer à des choses en termes relatifs de ce moment, de réduire le nombre de fois où je dois ramper à travers l'ensemble du document. À titre d'exemple (note, je me sers d'une abstraction sur la configuration du document traditionnel, mais les méthodes ci-dessous correspondent presque exactement aux méthodes traditionnelles):

XPathReader reader = new XPathReader("sourceXML\\Provinces.xml");           
String expression = "/mediawiki/page";
NodeList allProvinces = (NodeList)reader.read(expression, XPathConstants.NODESET);

for(int i=0; i < allProvinces.getLength(); i++) {
     expression = "/mediawiki/page[" + i + "]/revision/text/province/hanzi";
     String hanzi = reader.read(expression, XPathConstants.STRING).toString();

     expression = "/mediawiki/page[" + i + "]/revision/text/province/pinyin";
     String pinyin = reader.read(expression, XPathConstants.STRING).toString();

     Province currProv = new Province(hanzi, pinyin);         



     expression = "/mediawiki/page[" + i + "]/revision/text/province/Level2";
     NodeList level2 = (NodeList)reader.read(expression, XPathConstants.NODESET);

     for(int j=1; j < level2.getLength(); j++) {
           expression = "/mediawiki/page[" + i + "]/revision/text/province/Level2[" + j + "]/hanzi";
           String hanzi2 = reader.read(expression, XPathConstants.STRING).toString();   

           expression = "/mediawiki/page[" + i + "]/revision/text/province/Level2[" + j + "]/pinyin";
           String pinyin2 = reader.read(expression, XPathConstants.STRING).toString();  

         City currCity = new City(hanzi2, pinyin2);
         currProv.add(currCity);
...
     }
}   

Pour parler franchement, cela semble stupide. Je ne prends pas en compte le fait que tout au sujet de ces chaînes est identique une fois que je me lève au niveau qui me préoccupe. Je ne suis pas référencement tout type de chemin relatif, et chaque fois que je traverse une partie du document que je, en fait, traverse toute la chose. Ce serait génial si je pouvais bloquer le reste du document XML d'origine pendant un certain temps et se concentrer uniquement sur ma province, se référant à tout ce qui, en termes relatifs désormais.

Je dois surtout noter que la façon dont ce cher est derrière l'abstraction « lecture »:

xPath.compile(expression);
String result = xPathExpression.evaluate (xmlDocument, returnType);

Je suis essentiellement recompiler un modèle identique à une fin légèrement différente? Qu'en est-il de charger la partie d'intérêt et en se référant ensuite à ses enfants quelque chose comme « currProv / hanzi »?

J'ai regardé dans d'autres méthodes de parsing XML, et le « digesteur » semble faire quelque chose de semblable à ce que je veux http://commons.apache.org/digester/core.html , mais je l'ai déjà presque tout ce qu'il ya dans cette mise en œuvre XPATH.

J'ai le soupçon lancinant que la solution à ce problème est très simple ... mais je ne peux pas saisir tout à fait la solution. Quoi qu'il en soit, je vous remercie pour votre temps!

Était-ce utile?

La solution

XPath imbriqués relatifs sont la voie à suivre.

Je dirige la mise en œuvre EclipseLink JAXB (Moxy) et nous offrons cette capacité grâce à une annotation @XmlPath. Si vous avez déjà le XPath ce serait une cartographie relativement facile.

Pour en savoir plus, voir l'information:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top