Autor Beitrag
Ruffnex
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 07.02.17 11:28 
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:
ausblenden 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.

PS: Bitte demnächst Code-Tags selber benutzen.
Ruffnex Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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.

ausblenden 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:

ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.

PS: Ich habe daher mal den Titel angepaßt ("String" durch "XML" ersetzt).
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Di 07.02.17 21:12 
user profile iconRuffnex hat folgendes geschrieben Zum zitierten Posting springen:

Daraus muss ich nachher folgendes machen:

ausblenden 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:
ausblenden 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" />