добавление нескольких наборов данных с помощью цикла foreach в xml-документе

#c# #xml #unity3d

#c# #xml #unity3d

Вопрос:

Я программирую на C # для Unity. Моя цель — найти определенные узлы в моем XML-файле на основе атрибута («ftProtect», «ftWarn», «ftWarn2″), создать новые файлы и поместить туда наборы данных (содержимое). Для каждого атрибута все наборы данных (Name =»Feldsatz1″ / Name =»Feldsatz2») должны находиться в одном файле, но мой код просто помещает туда первый набор данных.

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml;
using UnityEngine.UI;
using System;
using System.Xml.Linq;

public class XML_divide : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //Load XML - File
        TextAsset txtXmlAsset = Resources.Load<TextAsset>("Feldsatz");
        //New Doc for the Text  
        XmlDocument doc = new XmlDocument();
        //Pass in the Text
        doc.LoadXml(txtXmlAsset.text);

        XmlNodeList xnList = doc.SelectNodes("/AreaList/Area/FieldList/Field[@Type]");

        var feldsatznummer_ftProtect = 0;
        var feldsatznummer_ftWarn = 0;
        var feldsatznummer_ftWarn2 = 0;


        foreach (XmlNode node1 in xnList)
        {
            if (node1.Attributes["Type"].Value == "ftProtect")
            {
                var innerXml_ftProtect = node1.InnerXml;
                Debug.Log(innerXml_ftProtect);
                feldsatznummer_ftProtect = feldsatznummer_ftProtect   1;
                XmlDocument doc_save = new XmlDocument();
                doc_save.LoadXml(innerXml_ftProtect);
                doc_save.Save(@"C:UsersmichaDesktopThesisUnityganzes Projekt_2AssetsResourcesftProtect"   "_"   feldsatznummer_ftProtect   ".xml");

            }
        }

        foreach (XmlNode node2 in xnList)
        {
            if (node2.Attributes["Type"].Value == "ftWarn")
            {
                var innerXml_ftWarn = node2.InnerXml;
                Debug.Log(innerXml_ftWarn);
                feldsatznummer_ftWarn = feldsatznummer_ftWarn   1;
                XmlDocument doc_save = new XmlDocument();
                doc_save.LoadXml(innerXml_ftWarn);
                doc_save.Save(@"C:UsersmichaDesktopThesisUnityganzes Projekt_2AssetsResourcesftWarn"   "_"   feldsatznummer_ftWarn   ".xml");

            }
        }

        foreach (XmlNode node3 in xnList)
        {
            if (node3.Attributes["Type"].Value == "ftWarn2")
            {
                var innerXml_ftWarn2 = node3.InnerXml;
                Debug.Log(innerXml_ftWarn2);
                feldsatznummer_ftWarn2 = feldsatznummer_ftWarn2   1;
                XmlDocument doc_save = new XmlDocument();
                doc_save.LoadXml(innerXml_ftWarn2);
                doc_save.Save(@"C:UsersmichaDesktopThesisUnityganzes Projekt_2AssetsResourcesftWarn2"   "_"   feldsatznummer_ftWarn2   ".xml");

            }
        }
    }
}
 

Исходный XML-файл:

 <?xml version="1.0" encoding="WINDOWS-1252"?>
<AreaList DeviceType="sctS300" FieldIntrusion="triple" Resolution="0,5">
    <Area CoordinatesType="polar" Name="Feldsatz 1" Index="0">
        <FieldList>
            <Field Type="ftProtect">
                <UserPointList>
                    <UserPoint Contour="FALSE" Distance="57" Angle="0" />
                    <UserPoint Contour="FALSE" Distance="50" Angle="81,5" />
                    <UserPoint Contour="FALSE" Distance="50" Angle="187,5" />
                    <UserPoint Contour="FALSE" Distance="56" Angle="270" />
                </UserPointList>
            </Field>
            <Field Type="ftWarn">
                <UserPointList>
                    <UserPoint Contour="FALSE" Distance="71" Angle="0" />
                    <UserPoint Contour="FALSE" Distance="64" Angle="83,5" />
                    <UserPoint Contour="FALSE" Distance="64" Angle="186" />
                    <UserPoint Contour="FALSE" Distance="71" Angle="270" />
                </UserPointList>
            </Field>
            <Field Type="ftWarn2" />
        </FieldList>
    </Area>
    <Area CoordinatesType="polar" Name="Feldsatz 2" Index="1">
        <FieldList>
            <Field Type="ftProtect">
                <UserPointList>
                    <UserPoint Contour="FALSE" Distance="57" Angle="0" />
                    <UserPoint Contour="FALSE" Distance="50" Angle="81,5" />
                    <UserPoint Contour="FALSE" Distance="32" Angle="115,5" />
                    <UserPoint Contour="FALSE" Distance="80" Angle="128" />
                    <UserPoint Contour="FALSE" Distance="80" Angle="142,5" />
                    <UserPoint Contour="FALSE" Distance="32" Angle="155" />
                    <UserPoint Contour="FALSE" Distance="50" Angle="187,5" />
                    <UserPoint Contour="FALSE" Distance="56" Angle="270" />
                </UserPointList>
            </Field>
            <Field Type="ftWarn">
                <UserPointList>
                    <UserPoint Contour="FALSE" Distance="71" Angle="0" />
                    <UserPoint Contour="FALSE" Distance="64" Angle="83,5" />
                    <UserPoint Contour="FALSE" Distance="64" Angle="186" />
                    <UserPoint Contour="FALSE" Distance="71" Angle="270" />
                </UserPointList>
            </Field>
            <Field Type="ftWarn2" />
        </FieldList>
    </Area>
</AreaList>
 

Выходные файлы для ftProtect (пример):

 <?xml version="1.0"?>
<Area CoordinatesType="polar" Name="Feldsatz 1" Index="1">
  <UserPointList>
    <UserPoint Contour="FALSE" Distance="57" Angle="0" />
    <UserPoint Contour="FALSE" Distance="50" Angle="81,5" />
    <UserPoint Contour="FALSE" Distance="50" Angle="187,5" />
    <UserPoint Contour="FALSE" Distance="56" Angle="270" />
  </UserPointList>
<Area CoordinatesType="polar" Name="Feldsatz 2" Index="1">
   <UserPointList>
     <UserPoint Contour="FALSE" Distance="57" Angle="0" />
     <UserPoint Contour="FALSE" Distance="50" Angle="81,5" />
     <UserPoint Contour="FALSE" Distance="32" Angle="115,5" />
     <UserPoint Contour="FALSE" Distance="80" Angle="128" />
     <UserPoint Contour="FALSE" Distance="80" Angle="142,5" />
     <UserPoint Contour="FALSE" Distance="32" Angle="155" />
     <UserPoint Contour="FALSE" Distance="50" Angle="187,5" />
     <UserPoint Contour="FALSE" Distance="56" Angle="270" />
</UserPointList>
 

Ответ №1:

Попробуйте следовать :

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:temptest.xml";
        const string OUTPUT_FOLDER = @"C:UsersmichaDesktopThesisUnityganzes Projekt_2AssetsResources";
        const string IDENT = "<?xml version="1.0"?>";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XDocument newDoc = null;
            List<XElement> areas = doc.Descendants("Area").ToList();

            foreach (XElement area in areas)
            {

                string coordinatesType = (string)area.Attribute("CoordinatesType");
                string name = (string)area.Attribute("Name");
                string index = (string)area.Attribute("Index");

                var groups = area.Descendants("Field")
                    .GroupBy(x => (string)x.Attribute("Type")).ToList();

                foreach (var group in groups)
                {
                    string type = group.Key;
                    XElement field = new XElement("Field", new XAttribute("Type", type));

                    newDoc = XDocument.Parse(IDENT   field.ToString());
                    XElement root = newDoc.Root;
                    foreach (XElement userPointList in group.Descendants("UserPointList"))
                    {
                        root.Add(userPointList);
                    }

                    string filename = string.Format("{0}_{1}_{2}_{3}.xml", coordinatesType, name, index, type);
                    newDoc.Save(@"c:temptest1.xml"); //for testing
                    //actual
                    //newDoc.Save(OUTPUT_FOLDER   filename);
                }
            }

        }
    }
}
 

Комментарии:

1. Спасибо за помощь, однако первый цикл foreach завершается после одного цикла, хотя их должно быть два. Я не получаю никаких ошибок, но каждый новый файл содержит только первый набор данных

2. Каждый раздел переходит в другой файл. Если вы правы, то там должно быть две области: List<XElement> areas = doc . Потомки («Область»). ToList();

3. Если я напечатаю список областей <XElement> = doc. Потомки («Область»). ToList(); в консоли это выглядит хорошо, но в результате получается один документ на «Тип», заполненный одним «полем», а не двумя

4. Вот почему у меня есть 2-й цикл for для каждого поля.

5. Прошу прощения за недоразумение — Отредактировал свой вопрос, чтобы уточнить — я хотел бы сгруппировать области по полям