Entwickler-Ecke

Basistechnologien - Suchen und Ersetzen bei unbekannten Werten in XML


Ruffnex - Di 07.02.17 11:28
Titel: Suchen und Ersetzen bei unbekannten Werten in XML
Hallo zusammen,
ich darf mich in meinem neuen Job mit C# befassen. Bin also noch ziemlich am Anfang.
Mein Problem:
Ich lade eine xml Datei und will diese durch suchen und ersetzen "umbauen". Dazu gehören Zeilen wie:

XML-Daten
1:
2:
3:
<apiver>1.0b</apiver>
<xmlver>1.0b</xmlver>
<language>1</language>

Da ich natürlich nicht weiß, ob es immer die Sprache "1" oder die Versionen "1.0b" sein werden, muss ich in der Suche hier irgendwie eine Wildcard oder ähnliches einbauen.

C#-Quelltext
1:
2:
3:
4:
5:
6:
string eingabe, suchen, ersetzen, anzeige;
eingabe = lblAnzeige.Text;
suchen = "<apiver>1.0b</apiver>\n<xmlver>1.0b</xmlver>\n<language>1</language>";
ersetzen = "Hier steht ein anderer Tag";
anzeige = eingabe.Replace(suchen, ersetzen);
lblAnzeige.Text = anzeige;

\n um die Zeilenumbrüche rauszunehmen ist klar. Aber was muss ich tun, um die 1.0b durch eine RegEx z.B. zu ersetzen, damit mich das auch nicht stört, wenn zukünftig dort z.B. eine 2.0a auftaucht?

Moderiert von user profile iconTh69: XML-Tags hinzugefügt
Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am Di 07.02.2017 um 11:25


Th69 - Di 07.02.17 12:32

Hallo und :welcome:

XML-Dateien solltest du nicht mittels einfacher Stringverarbeitung bearbeiten, sondern mittels spezialisierten XML-Klassen, wie z.B. XDocument, XmlDocument oder Linq-to-XML, s.a. how to change XML node values [http://stackoverflow.com/questions/11903552/how-to-change-xml-node-values].

PS: Bitte demnächst Code-Tags selber benutzen.


Ruffnex - Di 07.02.17 12:45

Okay, sorry.

Und danke.

Aber das löst mein Problem nicht. Ich will keine Values verändern sondern teilweise komplette Bereiche mit unterschiedlichen Values die sich immer unterscheiden.


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
<pim_attribute>
<pim_attribute_key>
<![CDATA[ Merkmal ]]>
</pim_attribute_key>
<pim_attribute_name>
<![CDATA[ Merkmal ]]>
</pim_attribute_name>
<pim_attribute_val>
<![CDATA[ 1 ]]>
</pim_attribute_val>
</pim_attribute>


Daraus muss ich nachher folgendes machen:


XML-Daten
1:
<Merkmal="1">                    


Hier fliegt also ein kompletter Tag raus und andere Bereiche werden ersetzt. Problem: Der Bereich pim_attribut kommt in der xml ungefähr 50 mal vor. Die Values sind also quasi vorher nicht bekannt. Somit brauche ich eben die Logik, die mir sucht nach

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
- <pim_attribute>
<pim_attribute_key>
<![CDATA[   --> Ersetzen durch <

- ]]>
</pim_attribute_key>
<pim_attribute_name>
<![CDATA[ Merkmal ]]>
</pim_attribute_name>
<pim_attribute_val>
<![CDATA[   --> Ersetzen durch ="

- ]]>
</pim_attribute_val>
</pim_attribute>  --> Ersetzen durch "
>


Moderiert von user profile iconTh69: XML-Tags hinzugefügt


Th69 - Di 07.02.17 13:11

Dann solltest du trotzdem mit XML-Funktionalität die Tags herausfiltern, dann löschen und durch einen neuen Tag ersetzen.
Lies einfach alle <pim_attribute> ein (mitsamt der Sub-Tags) und parse diese anhand von pim_attribute_name und pim_attribute_val (um daraus dann den neuen Tag-Namen und Value zu extrahieren).

Lies dich mal in XML ein, z.B. mittels des Open-Books Visual C# 2010: XML [http://openbook.rheinwerk-verlag.de/visual_csharp_2010/visual_csharp_2010_16_001.htm#mj08aac88383f4f0786adf7ec7b5e3e056].

PS: Ich habe daher mal den Titel angepaßt ("String" durch "XML" ersetzt).


jfheins - Di 07.02.17 21:12

user profile iconRuffnex hat folgendes geschrieben Zum zitierten Posting springen:

Daraus muss ich nachher folgendes machen:


XML-Daten
1:
<Merkmal="1">                    

Das ist eh komisch, weil das kein gültiges/wohlgeformtes XML ist. Ein Element muss einen Namen haben, und kann dann noch Attribute haben.

Als Beispiel, wie das Parsen von XML geht:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var data = XElement.Parse(@"<pim_attribute>
                <pim_attribute_key>
                  <![CDATA[ Merkmal ]]>
                </pim_attribute_key>
                <pim_attribute_name>
                  <![CDATA[ Merkmal ]]>
                </pim_attribute_name>
                <pim_attribute_val>
                  <![CDATA[ 1 ]]>
                </pim_attribute_val>
              </pim_attribute>"
);
var name = data.Element("pim_attribute_name").Value.Trim();
var value = data.Element("pim_attribute_val").Value.Trim();

var newXml = new XElement(name, new XAttribute("value", value));
Console.WriteLine(newXml.ToString());


Gibt auf der Console folgendes aus:
Zitat:
<Merkmal value="1" />