2010-07-26 7 views
0

Je dois concevoir une application Windows qui se trouvera sur l'intranet d'une organisation. L'application sera déployée sur la machine d'un utilisateur et l'utilisateur générera une sortie dans un fichier XML ayant un schéma prédéfini. Ce code XML sera écrit dans un dossier en réseau qui sera accessible aux autres utilisateurs. Ces fichiers sont nommés userid_output.xml. Le "userid" est tiré de l'environnement d'application. Lors de l'utilisation de l'application, un utilisateur doit avoir la capacité de rechercher tous les XML générés par l'univers des utilisateurs jusqu'à ce point. Les informations récupérées vont conduire l'utilisateur à façonner son entrée d'application. Une exigence très stricte est de ne pas utiliser de SGBDR (Oracle/Sql Server/MySql et al) pour stocker le XML. Le dossier réseau partagé est "THE REPOSITORY" et est uniquement utilisé pour stocker les XML. L'ordinateur hébergeant le dossier partagé ne peut exécuter aucun service pouvant aider à indexer les XML ou à optimiser les données à des fins de recherche. Compte tenu de ces limitations, quelqu'un connaît-il des techniques/outils/mécanismes de conception pour effectuer une récupération rapide de l'information à partir de cet «ensemble de données»?Recherche rapide dans des fichiers XML dans un dossier partagé

Merci

+0

Cela ressemble à des exigences assez horribles. Devons-nous comprendre que le but est d'analyser vos fichiers XML sur un disque pour effectuer une recherche le plus rapidement possible, sans indexation du tout? – StriplingWarrior

+1

Si je devais être entravé à un tel point, je dirais au revoir, expliquant que je ne peux pas faire mon travail sans les outils du métier. – Oded

+0

Une autre façon que je pensais d'extraire de manière sélective le XML sur le site client et d'effectuer la recherche en mémoire, mais si> 2000 utilisateurs émettent GBytes valeur de données tous les jours, cette approche échouera assez rapidement. –

Répondre

1

Vous pouvez utiliser XQuery. La fonction collection() vous permet d'interroger un répertoire de fichiers XML.

Voici un exemple utilisant Saxon. (Je ne sais pas si d'autres mises en œuvre seraient les mêmes.):

collection("file:///C:/sample_xml?select=*.xml;")

Ce sélectionnerait tous les fichiers * .xml dans le répertoire C:\sample_xml.

Vous pouvez également affiner les résultats en utilisant XPath:

collection("file:///file://///srv1/dir1/sample_xml?select=*.xml;")/doc/sample1[@id='someID']

Ce ne revenait que les sample1 éléments qui avaient un attribut id qui était égal à someID.

+0

Merci. Je n'ai aucune expérience antérieure en utilisant XQuery mais dans votre extrait ci-dessus utilisez-vous collection() pour former une représentation en mémoire des fichiers xml dans le répertoire C: \ sample_xml qui est stocké sur la machine du client? Que se passe-t-il si nous avons 7000 fichiers sample.xml et que nous nous intéressons uniquement à la valeur de la balise où l'attribut id est égal à "someId"?Comment XQuery aide-t-il à retourner ce sous-ensemble de manière optimisée sans imposer une charge énorme? –

+0

En quoi XQuery diffère-t-il de quelque chose comme Linq2Xml? –

+0

@sc_ray - Désolé, je n'ai aucune expérience avec Linq2Xml. Je vais ajouter un autre exemple à ma réponse pour montrer ce que je ferais pour affiner les résultats. –

Questions connexes