繁体   English   中英

unity XML 获取列表值从 xml 列表到 c# 列表

[英]Unity XML Get list values from xml list to c# list

我需要使用此 XML 从文件中的属性中检索列表值:

<LISTS>
<LIST list="213 82 14 2 3 4 18 4 1 5 5 3 6 5 2"/>
<LIST list="2 4 5 1 4 0 0 0 2 3 5 532 7 10 0"/>
<LIST list="10 511 4 8 2 6 4 721 2 5 7 10 10 4"/>
</LISTS>

使用 stream 阅读器,我将 XML 放入列表中的字符串中。 所以它看起来像这样:

 <LISTS><LIST list="213 82 14 2 3 4 18 4 1 5 5 3 6 5 2"/><LIST list="2 4 5 1 4 0 0 0 2 3 5 532 7 10 0"/><LIST list="10 511 4 8 2 6 4 721 2 5 7 10 10 4"/></LISTS>

然后我创建 XML 文档

Xmldoc = new XmlDocument();
Xmldoc.LoadXml(XmlLineList[0]) //i get an obj reference not set to instance of obj ex here. Even tho i can see in the inspector the xml line is there.

如果我使用

Xmldoc.Load(XmlLineList[0]) // Illegal characters in Path

这就是我所经历的。 我整晚都在阅读文档,但找不到一个好的答案或类似于我的案例。 需要将 xml 列表的元素传递到 c# 列表中。 每个列表都在一个不同的列表中,所以三个列表。

您的 XML 基本上由一系列<LIST>的列表list="1 2 3"整数组成。 您有几个选项来解析这个 XML 并为每个<LIST>元素提取一个List<int>列表。

首先,您可以使用XmlSerializer反序列化您的 XML。 首先定义如下数据model:

[XmlRoot("LISTS")]
public class ListRoot
{
    [XmlElement("LIST")]
    public List<ListEntry> Lists { get; set; } = new List<ListEntry>();
}

public class ListEntry
{
    [XmlAttribute("list")]
    public List<int> ListItems { get; set; } = new List<int>();
}

然后您可以从位于fileName的文件反序列化,如下所示:

ListRoot listRoot;
var serializer = new XmlSerializer(typeof(ListRoot));
using (var stream = File.OpenRead(fileName))
    listRoot = (ListRoot)serializer.Deserialize(stream);

通过使用[XmlAttribute("list")]标记List<int> ListItemsXmlSerializer将自动将空格分隔的list="2 4..."属性反序列化到内部ListItems列表中。

现在您可以按如下方式访问列表项:

foreach (var entry in listRoot.Lists)
{
    List<int> list = entry.ListItems; // The contents of each list="1 2 ..." /> attribute materialized as a List<int>
    // Process the List<int> list however you want:
    Console.WriteLine(string.Join(",", list));
}

哪个输出:

213,82,14,2,3,4,18,4,1,5,5,3,6,5,2
2,4,5,1,4,0,0,0,2,3,5,532,7,10,0
10,511,4,8,2,6,4,721,2,5,7,10,10,4

演示小提琴#1在这里

或者,您可以使用LINQ 到 XML 将 XML加载到XDocument中并使用Z979E0678FD89D7415C :22 查询它

var listRoot = XDocument.Load(fileName);

var listItems = listRoot.Root
    .Elements("LIST") // Select the <LIST> child nodes
    .Select(e => e.Attribute("list")) // Select the list=".." attribute
    .Select(a => a.Value.Split(' ').Select(s => XmlConvert.ToInt32(s)).ToList()) // Convert the space-delimited integer string to a list of integers
    .ToList(); // And materialize the query

foreach (List<int> list in listItems)
{
    // Process the List<int> list however you want:
    Console.WriteLine(string.Join(",", list));
}

演示小提琴#2在这里

我真的不建议将旧的XmlDocument用于新代码,因为 LINQ 到 XML 更易于使用且性能更高。

最好使用 LINQ 到 XML API。 它自 2007 年起在 .Net Framework 中可用。

这是您的起点。

c#

void Main()
{
    const string fileName = @"e:\temp\input.xml";
    // Load XML file directly from the file system
    //XDocument xdoc = XDocument.Load(fileName);
    
    XDocument xdoc = XDocument.Parse(@"<LISTS>
            <LIST list='213 82 14 2 3 4 18 4 1 5 5 3 6 5 2'/>
            <LIST list='2 4 5 1 4 0 0 0 2 3 5 532 7 10 0'/>
            <LIST list='10 511 4 8 2 6 4 721 2 5 7 10 10 4'/>
        </LISTS>
        ");
            
    foreach (XElement xelem in xdoc.Descendants("LIST"))
    {
        Console.WriteLine("list: '{0}'", xelem.Attribute("list").Value);
    }
}

Output

list: '213 82 14 2 3 4 18 4 1 5 5 3 6 5 2'
list: '2 4 5 1 4 0 0 0 2 3 5 532 7 10 0'
list: '10 511 4 8 2 6 4 721 2 5 7 10 10 4'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM