Генерируйте xml с c#, используя условный оператор - PullRequest
0 голосов
/ 15 апреля 2020

Возможно, мой вопрос может быть более логичным, чем техническим, или, возможно, я не использую лучшую библиотеку для этого случая. Я использую библиотеку xml в c# для создания XML файла. Вот так:

<Content>
    <Pid name>
        <pid name> NAME </pid name>
        <message>
            <message name> NAME </message name>
            <Pid>
                <content name> name </content name>
                <content name> name </content name>
                <content name> name </content name>
                <content name> name </content name>
            </Pid>
            <Pid>
                <content name> name </content name>
                <content name> name </content name>
                <content name> name </content name>
                <content name> name </content name>
            </Pid>
            <Pid>
                <content name> name </content name>
                <content name> name </content name>
                <content name> name </content name>
                <content name> name </content name>
            </Pid>
        </message>
    </pid name>
    <Pid name>
        <pid name> NAME </pid name>
        <message>
            <message name> NAME </message name>
            <Pid>
                <ByteBit> name </ByteBit>
                <ByteBitDescription> name </ByteBitDescription>
                <QualifierID> name </QualifierID>
                <DefaultValue> name </DefaultValue>
                <Size> name </Size>
                <ConversionType> name </ConversionType>
                <ConversionName> name </ConversionName>
                <ConversionID> name </ConversionID>

            </Pid>
            <Pid>
                <ByteBit> name </ByteBit>
                <ByteBitDescription> name </ByteBitDescription>
                <QualifierID> name </QualifierID>
                <DefaultValue> name </DefaultValue>
                <Size> name </Size>
                <ConversionType> name </ConversionType>
                <ConversionName> name </ConversionName>
                <ConversionID> name </ConversionID>

            </Pid>

        </message>
    </pid name>
    <Pid name>
        <pid name> NAME </pid name>
        <message>
            <message name> NAME </message name>
            <Pid>
                <ByteBit> name </ByteBit>
                <ByteBitDescription> name </ByteBitDescription>
                <QualifierID> name </QualifierID>
                <DefaultValue> name </DefaultValue>
                <Size> name </Size>
                <ConversionType> name </ConversionType>
                <ConversionName> name </ConversionName>
                <ConversionID> name </ConversionID>

            </Pid>

        </message>
    </pid name>

</content>

Вот интересная часть: я беру значения из ДОКУМЕНТА EXCEL, для этого я циклически просматривая всю таблицу, чтобы найти указанные c теги. Например, если одна ячейка в [row: n, col: 1] окрашена в синий цвет, значением этой ячейки будет PID NAME TAG Если цвет одной ячейки в [row: n, col : 1] значение этой ячейки будет TAG * ИМЯ СООБЩЕНИЯ Если цвет одной ячейки в [row: n, col: 1], значение этой ячейки будет CONTENT и все следующие значения соответствуют этому тегу, пока условие if не найдет следующую ячейку с атрибутом ** BLUE COLOR **. Вот код.

  string ByteBit;
    string ByteBitDescription;
    string QualifierID;
    string DefaultValue;
    string Size;
    string ConversionType;
    string ConversionName;
    string ConversionID;

    while (row < MAX_ROW)
    {
        Range cell = worksheet.Cells[row++, col];
        //PID
        //This if say that if given cell color is blue enters to the conditional 
        if (cell.Interior.Color == colorPID)
        {
            Console.WriteLine("PID NAME: " +cell.Text);
            row++;
        }
        //Messages
        // if given cell color is gray enters to the conditional
        else if (cell.Interior.Color == colorMSG)
        {
            //This get the value of a message
            Console.WriteLine("MESSAGE NAME:" + cell.Text);                
            row++;

            #region add transmitVarLines

            //if the given cell doenst have a filled color
            while (cell.Interior.Color == 0)

            ByteBit = Convert.ToString(worksheet.Cells[row, 1].Value2);
            ByteBitDescription = Convert.ToString(worksheet.Cells[row, 2].Value2);
            QualifierID = Convert.ToString(worksheet.Cells[row, 3].Value2);
            DefaultValue = Convert.ToString(worksheet.Cells[row, 4].Value2);
            Size = Convert.ToString(worksheet.Cells[row, 5].Value2);
            ConversionType = Convert.ToString(worksheet.Cells[row, 6].Value2);
            ConversionName = Convert.ToString(worksheet.Cells[row, 7].Value2);
            ConversionID = Convert.ToString(worksheet.Cells[row, 8].Value2);

            //print all this values
            row++;
        }
        else
            throw new Exception("Unexpected row = " + row + ", color = " + cell.Interior.Color);

    }

Я пытался использовать эту логику c в циклах с библиотекой xml, но она не работала

    XmlTextWriter xmlWriter = new XmlTextWriter(filename, System.Text.Encoding.UTF8);
    xmlWriter.Formatting = Formatting.Indented;

    xmlWriter.WriteStartDocument();
    xmlWriter.WriteComment("Creating an XML file using c#");
    xmlWriter.WriteStartElement("PID");
        xmlWriter.WriteStartElement("PID Name ");
        xmlWriter.WriteElementString("PID Name", "NAME");
                xmlWriter.WriteStartElement("Message");
                    xmlWriter.WriteElementString("Message Name", "MESSAGE");
                    xmlWriter.WriteStartElement("PID");
                        xmlWriter.WriteElementString("ByteBit", "00");
                        xmlWriter.WriteElementString("ByteBitDescription", "Description");
                        xmlWriter.WriteElementString("QualifierID", "00D0");
                    //This ends the STARTELEMENT PID IN THIS LEVEL
                    xmlWriter.WriteEndElement();
                //This ends the START ELEMENT MESSAGE IN THIS LEVEL
                xmlWriter.WriteEndElement();
        //This ends the start element PID NAME in this level
        xmlWriter.WriteEndElement();
    //This ends the startElement PID in this level
    xmlWriter.WriteEndElement();
    xmlWriter.Flush();
    xmlWriter.Close();

** Дело в том, что я не может завершить элемент write внутри каждого условия if, потому что он не будет следовать схеме, которую я хочу в xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...