используя XmlReader в c #? - PullRequest
       23

используя XmlReader в c #?

0 голосов
/ 02 июля 2019

Мне нужно разобрать файл XML.

Структура файла ниже:

<root> 
      <group id = "one">
             <info1>
                   <detail1> detail </detail1>
                   <detail2> detail </detail2>
             </info1>
             <info2>
                   <detail1> detail </detail1>
                   <detail2> detail </detail2>
             </info2>
      </group> 
      <group id = "two">
             <info1>
                   <detail1> detail </detail1>
                   <detail2> detail </detail2>
             </info1>
             <info2>
                   <detail1> detail </detail1>
                   <detail2> detail </detail2>
             </info2>
      </group> 

</root>

Я хотел бы хранить все внутри элемента группы в виде строки. Одна строка для всего в группе независимо от идентификатора атрибута. Как бы я сделал это с XMLReader?

Ответы [ 2 ]

1 голос
/ 02 июля 2019

у вас есть варианты загрузки класса с использованием сериализации или набора данных из XMLReader: class:

[Serializable]
[XmlRoot(ElementName="root")]
public class root
{
    [System.Xml.Serialization.XmlElementAttribute("group")]
    public List<Group> group { get; set; }
}

[Serializable()]
public class Group
{
    [System.Xml.Serialization.XmlAttributeAttribute("id")]
    public string id { get; set; }

    public Info info1 { get; set; }
    public Info info2 { get; set; }
}

[Serializable()]
public class Info
{
    [XmlElement]
    public string detail1 { get; set; }
    [XmlElement]
    public string detail2 { get; set; }
}

и examlpes:

string xml = "<root><group id=\"one\"><info1><detail1>detail</detail1><detail2>detail</detail2></info1><info2><detail1>detail</detail1><detail2>detail</detail2></info2></group><group id=\"two\"><info1><detail1>detail</detail1><detail2>detail</detail2></info1><info2><detail1>detail</detail1><detail2>detail</detail2></info2></group></root>";
    XDocument x = XDocument.Parse(xml, LoadOptions.PreserveWhitespace);

    //option1
    XmlReader reader = x.CreateReader();
    DataSet ds = new DataSet();
    //DataSet will contain multiple tables
    ds.ReadXml(reader);

    //option 2
    XmlSerializer ser = new XmlSerializer(typeof(root));
    XmlReader reader2 = x.CreateReader();
    var res = ser.Deserialize(reader2);

, в результате вы должны получить вариант 1 DataSetс несколькими таблицами, в варианте 2: загруженный объект cobject "root": result image

0 голосов
/ 02 июля 2019

С XML Reader вы можете применять

List <string> stringList = new List <string>();

while (xmlReader.Read()) {
 if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "group")) {

  string str = string.Empty;
  foreach(var element in xmlReader) {
   str += element.value;

  }
  stringList.add(str);

 }
}

Или Вы можете создать класс и выполнить сопоставление со свойствами

class Group {

 public string info1 {
  get;
  set;
 }

 public string info2 {
  get;
  set;
 }

 public string details1 {
  get;
  set;
 }

 public string details2 {
  get;
  set;
 }
}


List<Group> groupList = new List <Group>();

while (xmlReader.Read()) {
    if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "group")) {

     Group group = new Group();

     foreach(XmlNode node in xmlReader) {
      switch (node.Name) {
       case "info1":
        group.info1 = node.Value;
        break;
       case "info2":
        group.info2 = node.Value;
        break;
       case "details1":
        group.details1 = node.Value;
        break;
       case "details2":
        group.details2 = node.Value;
        break;        
      }
      groupList.add(group);
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...