XML-мульти-разбор в C # - PullRequest
       4

XML-мульти-разбор в C #

0 голосов
/ 18 января 2019

Мне нужно проанализировать Xml-структуру, как это в C #:

<Root>
  <respcondition continue="Yes">
    <conditionvar>
      <varequal respident="gap_0">auswahl1</varequal>
    </conditionvar>
    <setvar action="Add">1</setvar>
    <displayfeedback linkrefid="0_Response_0" feedbacktype="Response"/>
  </respcondition>
  <respcondition continue="Yes">
    <conditionvar>
      <varequal respident="gap_0">auswahl2</varequal>
    </conditionvar>
    <setvar action="Add">2</setvar>
    <displayfeedback linkrefid="0_Response_1" feedbacktype="Response"/>
  </respcondition>
</Root>

Я хочу проанализировать его следующим образом: я знаю, у какого "gap_x" есть несколько записей, поэтому я хочу сравнить его с атрибутом varequal "respident", и, если он совпадает, он должен быть сохранен в списке строк. Если пробел появляется в первый раз, для него должна быть новая запись списка, если он появляется во второй (или более) раз, он должен быть добавлен к существующей записи списка в соответствующий «gap_x».

Ранее я создал список со следующим содержанием: multigaps [0] = "gap_0" multigaps [1] = "gap_1"

В конце список должен выглядеть так: list [0] = auswahl1; auswahl2 (все значения с пробелом_0 в респонденте) /// list [1] = antwort1; antwort2 (все значения с паузой_1 в респонденте)

Может быть более 2 записей, это только пример.

Кроме того, мне нужно разобрать соответствующие <setvar action="Add">x</setvar> ко второму списку, который хранит эти значения в той же структуре, как это:

баллов [0] = 1; 2 (принадлежит к gap_0) /// Очки [1] = 3; 4 (принадлежит разрыву_1)

Ответы [ 2 ]

0 голосов
/ 18 января 2019

<!DOCTYPE questestinterop SYSTEM "ims_qtiasiv1p2p1.dtd">

<!--Generated by ILIAS XmlWriter-->

<questestinterop>


<item title="titel" maxattempts="0" ident="il_0_qst_152800">

<qticomment>beschreibung</qticomment>

<duration>P0Y0M0DT0H1M0S</duration>


<itemmetadata>


<qtimetadata>


<qtimetadatafield>

<fieldlabel>ILIAS_VERSION</fieldlabel>

<fieldentry>5.3.8 2018-08-29</fieldentry>

</qtimetadatafield>


<qtimetadatafield>

<fieldlabel>QUESTIONTYPE</fieldlabel>

<fieldentry>CLOZE QUESTION</fieldentry>

</qtimetadatafield>


<qtimetadatafield>

<fieldlabel>AUTHOR</fieldlabel>

<fieldentry>Patrick Maik Mächler</fieldentry>

</qtimetadatafield>


<qtimetadatafield>

<fieldlabel>additional_cont_edit_mode</fieldlabel>

<fieldentry>default</fieldentry>

</qtimetadatafield>


<qtimetadatafield>

<fieldlabel>externalId</fieldlabel>

<fieldentry>5c3f83ce4b6880.97213190</fieldentry>

</qtimetadatafield>


<qtimetadatafield>

<fieldlabel>textgaprating</fieldlabel>

<fieldentry>ci</fieldentry>

</qtimetadatafield>


<qtimetadatafield>

<fieldlabel>fixedTextLength</fieldlabel>

<fieldentry>1</fieldentry>

</qtimetadatafield>


<qtimetadatafield>

<fieldlabel>identicalScoring</fieldlabel>

<fieldentry>1</fieldentry>

</qtimetadatafield>


<qtimetadatafield>

<fieldlabel>combinations</fieldlabel>

<fieldentry>W10=</fieldentry>

</qtimetadatafield>

</qtimetadata>

</itemmetadata>


<presentation label="titel">


<flow>


<material>

<mattext texttype="text/xhtml"><p>text1</p> <div id="OKAYFREEDOM_INJECTED" style="display: none;"></div></mattext>

</material>


<material>

<mattext texttype="text/xhtml"><p></p> <p>text2</p> <p></p> <p>auswahllücke</mattext>

</material>


<response_str ident="gap_0" rcardinality="Single">


<render_choice shuffle="No">


<response_label ident="0">


<material>

<mattext>auswahl1</mattext>

</material>

</response_label>


<response_label ident="1">


<material>

<mattext>auswahl2</mattext>

</material>

</response_label>

</render_choice>

</response_str>


<material>

<mattext texttype="text/plain">textlücke</mattext>

</material>


<response_str ident="gap_1" rcardinality="Single">

<render_fib maxchars="2" columns="8" prompt="Box" fibtype="String"/>

</response_str>


<material>

<mattext texttype="text/plain">numlücke</mattext>

</material>


<response_num ident="gap_2" rcardinality="Single" numtype="Decimal">

<render_fib maxchars="3" columns="2" prompt="Box" fibtype="Decimal" maxnumber="100" minnumber="1"/>

</response_num>


<material>

<mattext texttype="text/xhtml"></p> <p></p> <div></div> <p></p> <div></div> <div></div></mattext>

</material>

</flow>

</presentation>


<resprocessing>


<outcomes>

<decvar/>

</outcomes>


<respcondition continue="Yes">


<conditionvar>

<varequal respident="gap_0">auswahl1</varequal>

</conditionvar>

<setvar action="Add">1</setvar>

<displayfeedback linkrefid="0_Response_0" feedbacktype="Response"/>

</respcondition>


<respcondition continue="Yes">


<conditionvar>

<varequal respident="gap_0">auswahl2</varequal>

</conditionvar>

<setvar action="Add">2</setvar>

<displayfeedback linkrefid="0_Response_1" feedbacktype="Response"/>

</respcondition>


<respcondition continue="Yes">


<conditionvar>

<varequal respident="gap_1">antwort1</varequal>

</conditionvar>

<setvar action="Add">3</setvar>

<displayfeedback linkrefid="1_Response_0" feedbacktype="Response"/>

</respcondition>


<respcondition continue="Yes">


<conditionvar>

<varequal respident="gap_1">antwort2</varequal>

</conditionvar>

<setvar action="Add">4</setvar>

<displayfeedback linkrefid="1_Response_1" feedbacktype="Response"/>

</respcondition>


<respcondition continue="Yes">


<conditionvar>

<varequal respident="gap_2">99</varequal>

</conditionvar>

<setvar action="Add">5</setvar>

<displayfeedback linkrefid="2_Response_0" feedbacktype="Response"/>

</respcondition>


<respcondition continue="Yes">


<conditionvar>

<varequal respident="gap_0">auswahl2</varequal>


<and>

<varequal respident="gap_1">antwort2</varequal>

</and>


<and>

<varequal respident="gap_2">99</varequal>

</and>

</conditionvar>

<displayfeedback linkrefid="response_allcorrect" feedbacktype="Response"/>

</respcondition>


<respcondition continue="Yes">


<conditionvar>


<not>

<varequal respident="gap_0">auswahl2</varequal>


<and>

<varequal respident="gap_1">antwort2</varequal>

</and>


<and>

<varequal respident="gap_2">99</varequal>

</and>

</not>

</conditionvar>

<displayfeedback linkrefid="response_onenotcorrect" feedbacktype="Response"/>

</respcondition>

</resprocessing>


<itemfeedback ident="0" view="All">


<flow_mat>


<material>

<mattext texttype="text/xhtml"><p></p> <div id="OKAYFREEDOM_INJECTED" style="display: none;"></div></mattext>

</material>

</flow_mat>

</itemfeedback>


<itemfeedback ident="1" view="All">


<flow_mat>


<material>

<mattext texttype="text/xhtml"><p></p> <div id="OKAYFREEDOM_INJECTED" style="display: none;"></div></mattext>

</material>

</flow_mat>

</itemfeedback>


<itemfeedback ident="2" view="All">


<flow_mat>


<material>

<mattext texttype="text/xhtml"><p></p> <div id="OKAYFREEDOM_INJECTED" style="display: none;"></div></mattext>

</material>

</flow_mat>

</itemfeedback>


<itemfeedback ident="response_allcorrect" view="All">


<flow_mat>


<material>

<mattext texttype="text/xhtml"><p></p> <div id="OKAYFREEDOM_INJECTED" style="display: none;"></div></mattext>

</material>

</flow_mat>

</itemfeedback>


<itemfeedback ident="response_onenotcorrect" view="All">


<flow_mat>


<material>

<mattext texttype="text/xhtml"><p>respnotcorrect</p> <div id="OKAYFREEDOM_INJECTED" style="display: none;"></div></mattext>

</material>

</flow_mat>

</itemfeedback>

</item>

</questestinterop>```

I need to parse this whole file and need only the parts I mentioned before. All other content is not needed for this.
0 голосов
/ 18 января 2019

Используя xml linq, я помещаю результаты в словарь, разбирая все свойства в xml

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

namespace ConsoleApplication97
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            List<Respcondition> responses = doc.Descendants("respcondition").Select(x => new Respcondition()
            {
                _continue = (string)x.Attribute("continue"),
                varequal = (string)x.Descendants("varequal").FirstOrDefault(),
                respident = (string)x.Descendants("varequal").FirstOrDefault().Attribute("respident"),
                setvar = (string)x.Element("setvar"),
                action = (string)x.Element("setvar").Attribute("action"),
                linkrefid = (string)x.Element("displayfeedback").Attribute("linkrefid"),
                feedbacktype = (string)x.Element("displayfeedback").Attribute("feedbacktype")
            }).ToList();

            Dictionary<string, List<Respcondition>> dict = responses.GroupBy(x => x.respident, y => y)
                .ToDictionary(x => x.Key, y => y.ToList());

        }
    }
    public class Respcondition
    {
        public string _continue { get; set; }
        public string varequal { get; set; }
        public string respident { get; set; }
        public string setvar { get; set; }
        public string action { get; set; }
        public string linkrefid { get; set; }
        public string feedbacktype { get; set; }
    }


}

 //<respcondition continue="Yes">
 //   <conditionvar>
 //     <varequal respident="gap_0">auswahl1</varequal>
 //   </conditionvar>
 //   <setvar action="Add">1</setvar>
 //   <displayfeedback linkrefid="0_Response_0" feedbacktype="Response"/>
 // </respcondition>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...