Laden...

Element mit einem Attribute finden, um anschließend dessen Value anzupassen

Erstellt von brave_snoopy vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.745 Views
B
brave_snoopy Themenstarter:in
99 Beiträge seit 2011
vor 7 Jahren
Element mit einem Attribute finden, um anschließend dessen Value anzupassen

Hallo,

ich versuche nun schon verzweifelt seit 3 Stunden eine XML Datei zu parsen, wo ich ein Element mit einem Attribute versuche zu finden, um anschließend dessen Value anzupassen.

Die XML Datei sieht wie folgt aus:


<resources xmlns="http://citrix.com/delivery-services/2-0/resources" xmlns:a="http://citrix.com/delivery-services/2-0/subscriptions" enumeration="full" a:subscriptionsstatus="enabled">
  <resource>
    <id>SWDLAB.Internet Explorer</id>
    <keywords>
      <keyword>featured</keyword>
    </keywords>
    <properties>
      <property propertyId="prefer">
        [COLOR]<value>Internet Explorer XA</value>
[/color]
      </property>
    </properties>
  </resource>
  <resource>
    <id>SWDLAB.Editor</id>
    <rade>
      <licenseType>online</licenseType>
      <offlineMode>none</offlineMode>
    </rade>
    <properties>
      <property propertyId="prefer">
        [COLOR]<value>EditorXA</value>
[/color]
      </property>
    </properties>
   <imagehash>WEcwODFWeDZHazlVWUlaS1dRTmtkQ0RHbEhvPQ--</imagehash>
   </resource>
</resources>

Habe den Teil, welchen ich suchen und ersetzen möchte, mal rot gefärbt.(OK geht nicht im XML Code. Der rotgefärbte Teil sollte zwischen ( stehen 😉

Mein derzeitiger Code sieht wie folgt aus:


var document = XDocument.Parse(valueToModify);
                if (document.Root != null)
                {
                    XNamespace ns = "http://citrix.com/delivery-services/2-0/resources";
                    var resources = document.Root.Descendants(ns + "resource");
                    foreach (var enabledElement in resources)
                    {
                        string propertieId = "prefer";
                        XElement xel = enabledElement.Element("property")
                           .Where(x => x.Attribute("propertyId").Value == propertieId)
                           .SingleOrDefault();
                    }
                    /*
                    
\*/
                    //FileLogger.WriteLog("Child: " + xel.Value);
                    return document.ToString();
                }

Aber leider klappt das Vorne und Hinten nicht.

Kann mir jemand hier bei helfen, wie ich bei jedem <value> Node den Wert anpasen, wo im darüberliegenden Element die propertieId "prefer" auftaucht?

Vielen Dank jetzt schon einmal für eure Hilfe.

16.834 Beiträge seit 2008
vor 7 Jahren

Du musst erst das Element suchen und kannst dann auf die Property zugreifen; umgekehrt geht.

foreach(var propertyNode in resources.Where(x=>x.Name.Equals(ns + "property") && x.Attribute[ns +"propertyId"].Value == "prefer")
{
    Console.Write("Value ist: "+ propertyNode.Element("value").Value)
}

Ansonsten natürlich die üblichen Hinweise..

Damit kommt man i.d.R. schneller und strukturierter ans Ziel.
Bei 3h würde ich nicht nur über den Fehler nachdenken, sondern auch über den Weg, wieso man 3h braucht und immer noch kein Ergebnis hat 😉

3.003 Beiträge seit 2006
vor 7 Jahren

Wenn du schon Linq To Xml nutzt:


XDocument.Parse(valueToModify).Root.Descendants("prefer").Select(p => p.Element("value")).ToList().ForEach(element => element.Value = newValue);

(Beispiel, du solltest XNamespace natürlich benutzen)

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

B
brave_snoopy Themenstarter:in
99 Beiträge seit 2011
vor 7 Jahren

Vielen Dank für eure Antworten.

Ja, in den 3h habe ich natürlich verschiedenste Lösungen probiert, aber nie zum Ziel gekommen. XML ist leider nicht ganz meine Stärke.

Habe es nun wie folgt probiert:


XNamespace ns = "http://citrix.com/delivery-services/2-0/resources";
                    var resources = document.Root.Descendants(ns + "resource");
                    //XDocument.Parse(valueToModify).Root.Descendants("prefer").Select(p => p.Element("value")).ToList().ForEach(element => element.Value = "blaBla");
                    foreach (var propertyNode in resources.Where(x => x.Name.Equals(ns + "property") && x.Attribute[ns + "propertyId"].Value == "prefer"))
                    {
                        FileLogger.WriteLog("geändert");
                    }

Aber erhalte vom Studio folgende Fehlermeldung:

Fehlermeldung:
Fehler CS0021 Eine Indizierung mit [] kann nicht auf einen Ausdruck vom Typ "Methodengruppe" angewendet werden. DisablePreferKeyword c:\users\swd\documents\visual studio 2015\Projects\DisablePreferKeyword\DisablePreferKeyword\Class1.cs 22 Aktiv

@Latino: Deinen Vorschlag habe ich auch versucht, aber da tut sich leider auch nichts. Der Value wird nicht geändert.

Ich Bedanke mich wirklich vielmals für die Hilfe.

3.003 Beiträge seit 2006
vor 7 Jahren

'türlich tut sich da nichts. Du hast ja auch meinen Hinweis, dass du XNamespace benutzen sollst, ignoriert.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

B
brave_snoopy Themenstarter:in
99 Beiträge seit 2011
vor 7 Jahren

'türlich tut sich da nichts. Du hast ja auch meinen Hinweis, dass du XNamespace benutzen sollst, ignoriert.

Ok, sorry. Aber ich verstehe es leider nicht 😦

Ich weiß, dass Forum ist nicht dafür da, Lösungen zu präsentieren, sondern eher um in die richtige Richtung zu weisen.

Aber es wäre äußerst nett, wenn ihr in diesem Fall mal eine kleine Ausnahme machen könntet.