DataSet - zapisywanie XML

0

Witam,
Mam 2 problemy z zapisywaniem XML.

Mam szablon prostego xml:


<?xml version="1.0" standalone="yes"?>
<Testy>
  <Wiersz>
    <String>Ala</String>
    <String>Adam</String>
    <String>Maciek</String>
  </Wiersz>
  <Wiersz>
    <String>Tomek</String>
    <String>Zofia</String>
    <String>Mariusz</String>
  </Wiersz>
  <Wiersz>
    <String>Stanislaw</String>
    <String>Michal</String>
    <String>Katarzyna</String>
  </Wiersz>
</Testy>

użytkownik w programie może zdefiniować nowy wiersz z nowymi stringami i tak próbuję to zapisać:

 DataSet ds = new DataSet();
            ds.ReadXml("Stringi1.xml");
            ds.Tables[0].Rows.Clear();
            foreach (Tekst item in listaTekstow)
            {
                DataRow row = ds.Tables[0].NewRow();
                row["String"] = item._String;
                ds.Tables[0].Rows.Add(row);
            }
            ds.WriteXml("Stringi.xml");

Wywala wyjątek:

System.Data.InvalidConstraintException: Nie można wyczyścić tabeli Wiersz, ponieważ element ForeignKeyConstraint Wiersz_String wymusza ograniczenia oraz w elemencie String istnieją wiersze podrzędne.

Ten kod działałby gdyby w znacznikach wiersz był tylko jeden znacznik <String> a nie parę. Jak więc mogę odczytać parę znaczników o tej samej nazwie?

  1. Drugi problem jest podobny do pierwszego. Mam taki przykładowy xml:

<?xml version="1.0" standalone="true"?>
<Testy>
   <Wiersz>
      <Punkt>
         <X>34</X>
         <Y>33</Y>
      </Punkt>
      <Punkt>
         <X>34</X>
         <Y>33</Y>
      </Punkt>
      <Punkt>
         <X>34</X>
         <Y>33</Y>
      </Punkt> 
      <Punkt>
         <X>34</X>
         <Y>33</Y>
      </Punkt>
      <Punkt>
         <X>34</X>
         <Y>33</Y>
      </Punkt>
   </Wiersz>
</Testy>

użytkownik, tak samo jak w pkt 1, może sam tworzyć nowy węzeł Wiersz ze znacznikami Punkt i ich wartościami, ale jak próbuję tak zapisać:

 DataSet ds = new DataSet();
            ds.ReadXml("Punkty.xml");
            //ds.Tables[1].Rows.Clear();
            DataRow row = ds.Tables[0].NewRow();
            ds.Tables[1].Rows.Clear();
            foreach (Punkt p in listapunktow)
            {
                
                DataRow row1 = ds.Tables[1].NewRow();

                row1["X"] = p.X;
                row1["Y"] = p.Y;
                ds.Tables[1].Rows.Add(row1);
                
            }
            ds.Tables[0].Rows.Add(row);
            ds.WriteXml("Punkty.xml");

To w wyniku dostaję to:


<?xml version="1.0" standalone="yes"?>
<Testy>
  <Wiersz />
  <Wiersz />
  <Punkt>
    <X>234</X>
    <Y>43</Y>
  </Punkt>
  <Punkt>
    <X>1321</X>
    <Y>10</Y>
  </Punkt>
  <Punkt>
    <X>232</X>
    <Y>111</Y>
  </Punkt>
</Testy>

czyli znaczniki <Wiersz> pieprzą się strasznie.

Jakieś pomysły?

0

zamiast trzy razy "string" w "wiersz" daj kolumna1, kolumna2, kolumna3

0
massther napisał(a)

zamiast trzy razy "string" w "wiersz" daj kolumna1, kolumna2, kolumna3

Na tej zasadzie mogę równie dobrze dawać string1, string2 i string 3, ale liczba stringów w "wiersz" jest dynamiczna, więc jak dynamicznie tworzyć nazwy i je potem odczytywać. Poza tym nawet jeżeli ustawie statyczną liczbę stringów, to jeszcze będę robić opcję, że jeżeli poda zły plik xml użytkownik to wygeneruje się automatycznie nowa baza danych w xml z losowymi wartościami/ stringami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1