verwendetes "Datenbanksystem": System.Xml.Linq;
Folgendes: Ich habe ein XML- Dokument welches erweitert und/oder angepasst werden soll und eines, in welchem alle "Änderungen/Erweiterungen" (in XML- Form) stehen.
Wie kann ich es lösen, dass entweder (falls bereits vorhanden) der Inhalt (Value) geändert, oder falls nicht vorhanden der Eintrag samt Value hinzugefügt werden kann?
Hat jemand eine Idee?
Hallo g0su,
probier das XElement
zu laden (entweder per .Element od. per .Descendantes(name)), falls es != null
so ist es vorhanden und der Value
kann überschrieben werden. Ansosten fügst du es hinzu.
Wo hakt es da?
Beachte bitte vorsorglich [Hinweis] Wie poste ich richtig? Punkt 1. und Punkt 3 (XDocument sagt nicht viel aus)
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Hat funktioniert 😃 danke Dir.
Ich hatte einen kleinen Denkfehler.
So geht es: Element anschauen wenn nicht "null" und dann je nach dem anpassen bzw. erstellen.
Hallo g0su,
super! 😃
Wenn du das Ganze noch in eine Erweiterungsmethode für XElement packst, so ist dieser Teil sogar wiederverwendbar.
Z.B.
public static class XElementExtensions
{
public static XElement CreateOrUpdate<T>(this XElement parent, string childName, T value)
{
if (parent == null)
throw new ArgumentNullException(nameof(parent));
if (string.IsNullOrWhiteSpace(childName))
throw new ArgumentNullException(nameof(childName));
Contract.EndContractBlock();
XElement child = parent.Element(childName);
if (child == null)
{
child = new XElement(childName);
parent.Add(child);
}
child.Value = value.ToString();
return child;
}
}
[TestFixture]
public class XElementExtensionsTests
{
[Test]
[ExpectedException(typeof(ArgumentNullException))]
public void Parent_is_null___Throws_ArgumentNull()
{
XElement parent = null;
parent.CreateOrUpdate("foo", 42);
}
[Test]
[ExpectedException(typeof(ArgumentNullException))]
public void ChildName_is_null_or_empty___Throws_ArgumentNull([Values(null, "", " ")] string elementName)
{
XElement parent = new XElement("parent");
parent.CreateOrUpdate(elementName, 42);
}
[Test]
public void Child_does_not_exist___Element_is_created_with_given_value()
{
XElement parent = new XElement("parent");
XElement element = parent.CreateOrUpdate("child", 42);
Assert.IsNotNull(parent.Element("child"));
Assert.AreEqual("42", element.Value);
}
[Test]
public void Child_exists___value_is_updated()
{
XElement parent = new XElement("parent",
new XElement("child")
);
XElement element = parent.CreateOrUpdate("child", 42);
Assert.AreEqual("42", element.Value);
}
}
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"