Конвертировать xml (смешанные узлы и атрибуты) в CSV-файл, используя c# - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть xml, который имеет смесь узлов и узлов с атрибутами, как показано ниже

<?xml version="1.0" encoding="utf-8"?>
<Root> 
    <StudentRequestList count="3">
    <StudentRequest>
        <StudentFirstName>Test1</StudentFirstName>
        <StudentLastName>TestLastName</StudentLastName>
        <StudentGrade>3</StudentGrade>
        <StudentHomeroomTeacher>WhiteTest1</StudentHomeroomTeacher>
        <VariableData>
            <Variable name="Email">test@email.com</Variable>
            <Variable name="Hobby1">TestHobby1</Variable>
            <Variable name="Hobby2">TestHobby2</Variable>
            <Variable name="Hobby3">TestHobby3</Variable>
            <Variable name="satscore">satscoreTest1</Variable>
            <Variable name="kprepscore">krepscore1</Variable>           
        </VariableData>
    </StudentRequest>
        <StudentRequest>
        <StudentFirstName>Test2</StudentFirstName>
        <StudentLastName>TestLastName2</StudentLastName>
        <StudentGrade>3</StudentGrade>
        <StudentHomeroomTeacher>WhiteTest1</StudentHomeroomTeacher>
        <VariableData>
            <Variable name="Email">test2@email.com</Variable>
            <Variable name="Hobby5">TestHobby5</Variable>
            <Variable name="Hobby6">TestHobby6</Variable>
            <Variable name="Hobby3">TestHobby3</Variable>
            <Variable name="satscore">satscoreTest2</Variable>
            <Variable name="kprepscore">krepscore2</Variable>           
        </VariableData>
    </StudentRequest>
        <StudentRequest>
        <StudentFirstName>Test1</StudentFirstName>
        <StudentLastName>TestLastName</StudentLastName>
        <StudentGrade>3</StudentGrade>
        <StudentHomeroomTeacher>WhiteTest1</StudentHomeroomTeacher>
        <VariableData>
            <Variable name="Email">test@email.com</Variable>
            <Variable name="Hobby4">TestHobby4</Variable>
            <Variable name="Hobby2">TestHobby2</Variable>
            <Variable name="Hobby3">TestHobby3</Variable>
            <Variable name="satscore">satscoreTest3</Variable>
            <Variable name="kprepscore">krepscore3</Variable>           
        </VariableData>
    </StudentRequest>
    </StudentRequestList>
    </Root>



CSV должен выглядеть ниже

StudentFirstName,StudentLastName,StudentGrade,StudentHomeroomTeacher,Email, Hobby1, Hobby2,Hobby3, Hobby4, Hobby5, Hobby6, satscore, kprepscore     
Test1,TestLastName,3,WhiteTest1,test@email.com,TestHobby1,TestHobby2,TestHobby3,,,,satscoreTest1,krepscore1 
Test2,TestLastName2,3,WhiteTest1,test2@email.com,,,Hobby3,,Hobby5,Hobby6,satscoreTest2,krepscore2
Test1,TestLastName,3,WhiteTest1,test@email.com,,Hobby2,Hobby3,Hobby4,,,satscoreTest3,krepscore3

Я могу извлечь значения для узлов без атрибутов (как показано в коде ниже), но для других узлов с атрибутами (variabledata / variable), пытающихся получить значения, чтобы я мог создать файл csv, как показано выше. Любые предложения приветствуются. Спасибо.

  XDocument custOrd = XDocument.Load(FILENAME);

                string csv =
                                    (from el in custOrd.Element("Root").Element("StudentRequestList").Elements("StudentRequest")
                                     select
                             String.Format("{0},{1},{2},{3},{4}{5}",
                                 (string)el.Element("StudentFirstName"),
                                 (string)el.Element("StudentLastName"),
                                 (string)el.Element("StudentGrade"),
                                 (string)el.Element("StudentHomeroomTeacher"),
                                el.Element("VariableData").Element("Variable").Attribute("name").Value.Equals("Email") ? (string)el.Element("VariableData").Element("Variable") : null,                                
                                 Environment.NewLine
                             )
                                    )
                    .Aggregate(
                        new StringBuilder(),
                        (sb, s) => sb.Append(s),
                        sb => sb.ToString()
                    );
                Console.WriteLine(csv);
                Console.ReadLine();

1 Ответ

0 голосов
/ 15 апреля 2020

Вот небольшой метод, который может обернуть атрибут чтения logi c

private static string ValueOf(XElement el, string name)
{
    return (string)el.Element("VariableData")
        .Elements("Variable")
        .FirstOrDefault(x => x.Attribute("name").Value.Equals(name));
}

Используя этот метод в нашем операторе select для каждого элемента <Variable> с разными именами, мы можем прочитать все переменные, которые существуют и возвращают "" для тех, которые не существуют.

Я также переписываю ваш шаблон формата строки, потому что в нем недостаточно параметров для того, что вы хотите написать:

Теперь ваш оператор выбора должен выглядеть следующим образом:

from el in custOrd.Element("Root").Element("StudentRequestList").Elements("StudentRequest")
select
    String.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12}",
        (string)el.Element("StudentFirstName"),
        (string)el.Element("StudentLastName"),
        (string)el.Element("StudentGrade"),
        (string)el.Element("StudentHomeroomTeacher"),
        ValueOf(el, "Email"), ValueOf(el, "Hobby1"), ValueOf(el, "Hobby2"), ValueOf(el, "Hobby3"),
        ValueOf(el, "Hobby4"), ValueOf(el, "Hobby5"), ValueOf(el, "Hobby6"),
        ValueOf(el, "satscore"),
        ValueOf(el, "kprepscore"),
        Environment.NewLine
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...