2010-08-26 5 views
0

est mon scénario ici,idées pour modifier les attributs de différents fichiers XML C#

  1. Je copie des fichiers XML du répertoire d'origine au répertoire cible
  2. je modifie les attributs du fichier dans le répertoire d'origine
  3. Je compare l'attribut du fichier modifié (de l'annuaire original) avec l'attribut du fichier copié (dans le répertoire cible) Ils ne devraient pas être les mêmes bien sûr

Mon problème est que pas tout le XML Les fichiers ont les mêmes attributs.

J'ai essayé d'ajouter un attribut commun et le modifier, mais les fichiers sont récupérés à partir d'un DB et chaque attribut représente un y coloumn et je ne peux pas modifier le DB

Je pense à une boucle à travers les attributs, jusqu'à ce que j'atteigne le premier attribut "non-fixe" et le modifie. Est-ce possible? si c'est le cas, comment? et s'il y a d'autres solutions que je vais apprécier encore plus :)

Voici un exemple d'une partie de mes xmls

<CtApproachTypes 
DataclassId="1992A9CE-B048-4676-BFD4-FD81F1A65401" 
EntityId="1992A9CE-B048-4676-BFD4-FD81F1A65401" 
Name="PAR" 
Remark="No Remarks"/> 
</CT_ApproachTypes> 

<MiMissions 
DataclassId="C196A66B-4FA1-461C-9EEF-95A4F2085051" 
EntityId="C196A66B-4FA1-461C-9EEF-95A4F2085051" 
MissionName="Standard" 
isib="1" 
</MiMissions> 

<StSituations 
DataclassId="679FAC3C-C9EF-41FD-9A13-957915605F01" 
EntityId="679FAC3C-C9EF-41FD-9A13-957915605F01" 
SitName="Standard" 
Status="C" 
Template="1"> 
</StSituations> 

Je veux sauter les deux premiers attributs et modifier le premier attribut après eux.

Note: J'ai vérifié les fichiers XML et tous semblent avoir un attribut avec "-name" dans eux. Je pensais à l'aide « comme » pour interroger .. mais une solution plus solide serait de modifier le premier attribut après la première 2.

Merci

+0

Pour rendre la question plus claire, vous pouvez ajouter quelques exemples où vous voulez que vos attributs à la terre dans le fichier différent. –

+0

Je ne veux pas qu'ils atterrissent n'importe où. J'ai juste besoin de changer un attribut dans le fichier XML original, puis le comparer avec le fichier XML copié dans un autre répertoire – Reda

+0

Cela ressemble à l'autre question que vous avez déjà posée (http://stackoverflow.com/questions/3565038/adding-attributes -to-xml-file-linq-c). Et l'étape 1 indique que vous copiez à partir d'un répertoire, mais vous avez ensuite déclaré que les fichiers sont extraits d'une base de données. Pourriez-vous clarifier votre question comme quoi vous avez besoin d'aide (pas tout le processus de ce que vous faites, juste l'endroit où vous avez besoin d'aide). – PatrickSteele

Répondre

0

Si ce que vous essayez de faire est des attributs de mise à jour de XML cela pourrait être une façon:

XElement elem = XElement.Load("xmlFilePath"); 
System.Xml.XPath.Extensions.XPathSelectElement(elem, "xpath").SetAttributeValue("attributeName", "newValue"); 

où xmlFilePath est le chemin vers le fichier XML que vous modifiez, XPath est le chemin de l'élément du xml et attributeName est le nom des noeuds attribut que vous travaillez sur des ... Bien sûr, vous devez ajouter un noeud personnalisé avec un attribut à chaque xml que vous utilisez.

EDIT: Puisque vous avez dit que vous ne pouvez pas modifier les fichiers XML dans les deux endroits, que tout ce que vous êtes de gauche avec est de comparer les propriétés FileInfo des fichiers eux-mêmes. Et si les propriétés FileInfo ne sont pas ce dont vous avez besoin, alors il n'y a pas d'autre solution que de créer un db de suivi ou un fichier, qui contiendra des valeurs d'attribut pour votre répertoire Original et Cible, par lequel vous pouvez comparer et faire action. Par exemple, si votre Original et Target mappent 1 sur 1, vous pourriez avoir une structure de table simple comme ceci 'TableName, OriginalValue, TargetValue'. Où vous garderiez ces données de 'tracking' (db, fichier xml, autre ...) dépend du nombre d'entrées, et de votre architecture actuelle ...

EDIT2: Si vous wan't à ajouter au premier attribut trouvé, vous pouvez utiliser ceci:

XElement elem = XElement.Load("myfilepath.xml"); 
    elem.FirstAttribute.SetValue(elem.FirstAttribute.Value + "|myothervalue"); 
+0

Je ne peux pas ajouter un noeud personnalisé qui pose problème. Les XML sont générés à partir de DB Coloumns représentant leurs attributs. Et je ne peux pas modifier la base de données. Ce dont j'ai besoin, c'est d'un moyen de modifier les fichiers XML en sachant que tous les fichiers XML n'ont pas un attribut commun. – Reda

+0

Vous pouvez ajouter un attribut à l'élément racine car la racine existe toujours et n'est pas liée aux tables (si ce n'est pas le cas, veuillez poster un simple exemple de fichier XML). Si l'attribut n'existe pas, SetAttributeValue le créera pour vous - assurez-vous simplement qu'il s'agit d'un nom unique au cas où. – veljkoz

+0

J'ai utilisé le "SetAttributeValue" et ajouté un nouvel attribut nommé "Sabassi" mais il m'a quand même donné l'exception NullReferenceException ..: S – Reda

Questions connexes