Как я могу преобразовать XML в список <string>или строку []? - PullRequest
16 голосов
/ 05 июня 2009

Как я могу преобразовать следующий XML в List<string> или String[]:

<Ids>
  <id>1</id>
  <id>2</id>
</Ids>

Ответы [ 8 ]

46 голосов
/ 05 июня 2009

Похоже, вы больше после простого анализа, а не полной сериализации / десериализации XML. Если вы можете использовать LINQ to XML, это довольно просто:

using System;
using System.Linq;
using System.Xml.Linq;

public class Test
{
    static void Main()
    {
        string xml = "<Ids><id>1</id><id>2</id></Ids>";

        XDocument doc = XDocument.Parse(xml);

        var list = doc.Root.Elements("id")
                           .Select(element => element.Value)
                           .ToList();

        foreach (string value in list)
        {
            Console.WriteLine(value);
        }
    }
}

На самом деле вызов Elements может опустить аргумент, поскольку являются только id элементами, но я подумал, что продемонстрирую, как указать, какие элементы вы хотите.

Точно так же я бы обычно не стал звонить ToList, если бы мне действительно не понадобился List<string> - без него результат будет IEnumerable<string>, что хорошо, если вы просто итерируете один раз , Чтобы создать массив, используйте ToArray.

18 голосов
/ 05 июня 2009

Вот способ использования XmlDocument:

// A string containing the XML data
string xml = "<Ids><id>1</id><id>2</id></Ids>";
// The list you want to fill
ArrayList list = new ArrayList();

XmlDocument doc = new XmlDocument();
// Loading from a XML string (use Load() for file)
doc.LoadXml(xml); 
// Selecting node using XPath syntax
XmlNodeList idNodes = doc.SelectNodes("Ids/id");
// Filling the list
foreach (XmlNode node in idNodes)
    list.Add(node.InnerText);
3 голосов
/ 11 февраля 2011

С любым типом коллекции. Например:

<Ids> <id>C:\videotest\file0.txt</id> <id>C:\videotest\file1.txt</id> </Ids>

class FileFormat
    {
        public FileFormat(string path)
        {
            this.path = path;
        }
        public string FullPath
        {
            get { return Path.GetFullPath(path); }
        }
        public string FileName
        {
            get { return Path.GetFileName(path); }
        }
        private string path;
    }

List<FileFormat> Files =
        selectedNode
        .Descendants("Ids")
        .Elements("Id")
        .Select(x => new FileFormat(x.Value))
        .Where(s => s.FileName!=string.Empty)
        .ToList();
2 голосов
/ 18 января 2011

код для преобразования массива строк в xml

items это строковый массив

items.Aggregate("", (current, x) => current + ("<item>" + x + "</item>"))
1 голос
/ 07 февраля 2011

Этот пример будет работать с .NET Framework 4.0:

в список

    List<string> Ids= new List<string>(); 
    Ids= selectedNode.Descendants("Ids").Elements("Id").Select(> x=>x.Value).Where(s =>s!= string.Empty).ToList();

в строку []

    string[] Ids= thisNode
                  .Descendants("Ids")          // Ids element
                  .Elements("Id")              // Id elements
                  .Select(x=>x.Value)          // XElement to string
                  .Where(s =>s!= string.Empty) // must be not empty
                  .ToArray();                  // string to string []
1 голос
/ 05 июня 2009

Этот пример будет работать с .NET Framework 3.5:

    System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse("<Ids>  <id>1</id>  <id>2</id></Ids>");
    System.Collections.Generic.List<string> ids = new System.Collections.Generic.List<string>();
    foreach (System.Xml.Linq.XElement childElement in element.Descendants("id"))
    {
        ids.Add(childElement.Value);
    }
0 голосов
/ 05 июня 2009

Вот способ получить типизированный массив из XML с помощью DataSets. (в этом примере массив удваивается)

DataSet dataSet = new DataSet()
DoubleArray doubles = new DoubleArray(dataSet,0);

dataSet.ReadXml("my.xml");
double a = doubles[0];



public class DoubleArray
{
  DataSet dataSet;
  int tableIndex;
  public DoubleArray(DataSet dataSet,int tableIndex)
  {
    this.dataSet=dataSet;
    this.tableIndex=tableIndex;
  }

  public double this[int index]
  {
    get
    { 
      object ret = dataSet.Tables[tableIndex].Rows[index];
      if(ret is double?) 
        return (ret as double?).Value;
      else
        return double.Parse(ret as string);
    }
    set
    {
      object out = dataSet.Tables[tableIndex].Rows[index];
      if(out is double?)
        dataSet.Tables[tableIndex].Rows[index] = (double?)value;
      else
        dataSet.Tables[tableIndex].Rows[index] = value.ToString();
    }
  }
}

Конечно, разбор парных чисел и их постоянное преобразование обратно в строки могут быть расценены некоторыми программистами как кощунство ... Даже для меня было трудно не думать о такой трате ресурсов ... но я думаю, иногда лучше просто отвернуться от другого .. не подчеркивай:)

0 голосов
/ 05 июня 2009

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

Properties prop = new Properties();
prop.loadFromXML(stream);
Set set = prop.keySet();

Вы можете получить доступ к строкам из набора для каждого ключа. Ключ - это имя элемента xml.

...