Modyfikacja pliku XML

0

Mam plik XML o przykładowej strukturze

<Invoice-Lines>
    <Line>
      <Line-Item>
        <LineNumber>1</LineNumber>
        <EAN>4007954054116</EAN>
      </Line-Item>
    </Line>
    <Line>
      <Line-Item>
        <LineNumber>3</LineNumber>
        <EAN>4007954054123</EAN>
      </Line-Item>
    </Line>
    <Line>
</Invoice-Lines>

Teraz Do każdego <Line-Item> chciałbym dodać nowy element <OrderLineNumber> z taką samą wartością jak <LineNumber> a element <LineNumber> przenumerować zamiast 1,3 było 1,2.
Ktoś ma pomysł jakby to można było rozwiązać, przy założeniu że liczba linii zamówienia może być różna?

Stanąłem na tym, że mam dwie tabele

int[] LinesOrg = new int[CountLine]; // dla tego przykładu tabela zawiera wartośći 1,3
int[] LinesNew = new int[CountLine]; // dla tego przykładu tabela zawiera wartości 1,2

Gdzie CountLine to ilość linii w zamówieniu pobierane ze zmiennej.

I teraz w pętli chciałbym zmodyfikować wartość <LineNumber> i dodać element <OrderLineNumber> do węzła <Line-Item> przyjmując wartości z tych dwóch tabel.
Nie potrafię odnieść się do elementu <LineNumber>1</LineNumber> aby dodać pod nim <OrderLineNumber>1</OrderLineNumber>
Tak samo <LineNumber>3</LineNumber> aby dodać pod nim <OrderLineNumber>3</OrderLineNumber> i zmienić <LineNumber>3</LineNumber> na <LineNumber>2</LineNumber>

0

Pytanie czy <OrderLineNumber> będzie zawsze o jeden większa od <LineNumber>? Jeśli tak, to zdeserializuj XMLa do obiektu w C# i w każdym <Line-Item> do którego będziesz dodawał <OrderLineNumber> zmniejsz o jeden <LineNumber> i serializacja do XML.

0

Nie zawsze. <LineNumber> może być 9 a <OrderLineNumber> 11. Po prostu muszę odczytać wartość z LineNumber i wpisać ją do nowego elementu OrderLineNumber a LineNumber musi być zachowana kolejność 1,2,3,4,5,6...

0

Na jakiej podstawie wiesz, że <LineNumber> jest 9, a <OrderLineNumber> 11?

0

Tak jest to zapisane w pliku XML który otrzymuję do modyfikacji. Na początku linie są wszystkie w kolejności, ale często zdarza się, że pozycjen na zamówieniu są usuwane i wtedy <linenumber> jest nie po kolei, np 1,3,5,7,10, wtedy te wartości muszę przepisać do pola <OrderLineNumber> a <LineNumber> przenumerować 1,2,3,4,5

czyli powinno być

LineNumber OrderLineNumber
1 1
2 3
3 5
4 7
5 10

To takie założenie biznesowe ze strony dostawcy, że jego linie muszą być kolejne w zamówieniu, ale muszą być pomapowane z liniami na moich zamówieniach.
Bardziej mi chodzi o to w jaki sposób ustawić się na danym elemencie i zmienić mu wartość i jak pod wybranym elementem dodać nowy element.

1

Zrób sobię klasę

public class InvoiceLine
{
   public List<Line> Lines {get;set;}
}

public class Line
{
   public LineItem Line-Item {get;set;}
}

public class LineItem
{
   public int LineNumber {get;set}
   public string EAN {get;set;}
}

Piszę z głowy, mogą być jakieś poprawki :D

        public static void SerializeXML<T>(T obj, string filePath)
        {
            XmlSerializer xml = new XmlSerializer(typeof(T));
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("", "");
            using (TextWriter tw = new StreamWriter(filePath))
            {
                xml.Serialize(tw, obj, ns);
            }
        }


        public static T DeserializeXML<T>(string filePath)
        {
            T obj;
            XmlSerializer xml = new XmlSerializer(typeof(T));
            using (FileStream sr = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                obj = (T)xml.Deserialize(sr);
            }
            return obj;
        }

Robisz sobie z tego obiekt, wykonujesz odpowiednie operacje i serializujesz do XML.

InvoiceLine invoiceLine = Deserialize<InvoiceLine>("plik.xml");
//super wypasione operacje na listach
Serialize(invoiceLine, "plik.xml");
0

Dziękuję za szybką odpowiedź. Za dużo kombinowałem, wykorzystam ten przykład. Bardzo mi pomogłeś.

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