Laden...

Bei XDocument Inhalt ändern, falls vorhanden, sonst hinzufügen

Erstellt von g0su vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.366 Views
G
g0su Themenstarter:in
45 Beiträge seit 2013
vor 7 Jahren
Bei XDocument Inhalt ändern, falls vorhanden, sonst hinzufügen

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?

6.911 Beiträge seit 2009
vor 7 Jahren

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!"

G
g0su Themenstarter:in
45 Beiträge seit 2013
vor 7 Jahren

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.

6.911 Beiträge seit 2009
vor 7 Jahren

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!"