Создание XML с использованием XDocument с Object, который имеет два списка - PullRequest
0 голосов
/ 03 июля 2018

Я нахожусь в процессе создания документа XML с использованием XDocument в C #. Я перебираю коллекцию объектов, в которой есть другая коллекция. Вот пример того, что я пытаюсь создать.

<Documents>
  <Document>
     <Field_1></Field_1>
     <Field_2></Field_2>
     <Field_3></Field_3>
     <Field_4></Field_4>
     <Address>
        <Item1></Item1>
        <Item2></Item2>
     </Address>
  </Document>
</Documents>

Теперь, используя мой код ниже, я могу добавить все документы и их поля, используя мой цикл foreach для основного объекта, но я не могу добавить связанный адрес для каждого документа, используя второй цикл foreach, который находится внутри первого foreach. петля. Основная проблема, с которой я, похоже, сталкиваюсь, заключается в том, что, когда я сталкиваюсь с документом, скажем, 5 документов в моей коллекции, второй цикл foreach помещает адрес этого 5-го документа в блок адреса 1-го документа. Мне нужно, чтобы оно соответствовало 5-му документу, а не 1-му.

 XDocument xmlDoc = XDocument.Load(Path.Combine(@"C:\XML_Template\", "XMLTemplate.xml"));
 XElement rootElement = xmlDoc.Element("DOCUMENTS");

        foreach (var pdf in PDFDocInfo) {
            rootElement.Add(
                new XElement("DOCUMENT",
                    new XElement("Field_1", pdf.F1),
                    new XElement("Field_2", pdf.F2),
                    new XElement("Field_3", pdf.F3),
                    new XElement("Field_4", pdf.F4),
                    ));
            foreach (var address in pdf.Address) {
                rootElement.Element("DOCUMENT").Add(
                    new XElement("Address",
                        new XElement("Item1", address.I1),
                        new XElement("Item2", address.I2));
                 }
             }

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 03 июля 2018

На первой итерации вы создаете элемент Document, заполняете поля и добавляете элемент Address. На второй итерации вы добавляете второй элемент Document, заполняете поля, а затем добавляете элемент Address в элемент FIRST Document (rootElement.Element ("DOCUMENT") получает первый элемент "DOCUMENT").

https://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.element(v=vs.110).aspx

Я бы вместо этого создал каждый новый «ДОКУМЕНТ», включая адрес, а затем добавил бы его в ДОКУМЕНТЫ.

foreach (var pdf in PDFDocInfo) {
    // create a "Document" element
    newDoc = new XElement("DOCUMENT",
        new XElement("Field_1", pdf.F1),
        new XElement("Field_2", pdf.F2),
        new XElement("Field_3", pdf.F3),
        new XElement("Field_4", pdf.F4),
    );
    // add any Address elements to newDoc
    foreach (var address in pdf.Address) {
        newDoc.Add(
            new XElement("Address",
                new XElement("Item1", address.I1),
                new XElement("Item2", address.I2));
        }
    }
    // add newDoc to Documents
    rootElement.Add(newDoc);
}
...