将日期排序的XML元素列表显示为UI文本
本文关键字:列表显示 UI 文本 元素 XML 日期 排序 | 更新日期: 2023-09-27 18:06:11
我有一个XML文档,有几个不同的部分,我需要生成一个"feed"的最新条目,在场景中显示为UI文本。我有一个按日期排序条目的方法在他们的部分,我知道的作品,我一直试图将其应用到整个文档。
这是一个文档结构的例子:
<Document>
<Data>3</Data>
<Section1>
<Type1>
<Entry ID="1">
<Date>09/08/2011</Date>
<Details1>text</Details1>
</Entry>
<Entry ID="3">
<Date>07/3/2012</Date>
<Details2>text</Details2>
</Entry>
</Type1>
<Type2 />
<Type3>
<Entry ID="2">
<Date>08/8/2011</Date>
<Details3>text</Details3>
<Details4>text</Details4>
</Entry>
</Type3>
</Section1>
<Section2>
<Type4 />
<Type5 />
</Section2>
...
</Document>
问题在于,与我之前的方法不同,我需要对每个条目的日期进行排序并显示它们-而不是在它们的单独部分中。到目前为止,日期已经显示在所有地方,尽管我相当确定它们被正确排序。
到目前为止,我的代码如下(排序方法取自一篇非常有用的博客文章,我找不到链接): public void Feed () {
Debug.Log ("Feed initiated");
// FOR SORTING AND DISPLAYING THE DATA
XDocument xDocument = XDocument.Load (Application.persistentDataPath + "/UserData/document.xml");
var all =
from objActs in xDocument.Element("Document").Descendants("Entry")
let actDate = DateTime.ParseExact(objActs.Element("Date").Value,"d/M/yyyy",new CultureInfo("en-GB"))
orderby actDate
select objActs;
foreach (var objActs in all.ToList())
{
foreach (var aa in objActs.Ancestors("Section1").Elements("Type1").Elements("Entry")) {
Debug.Log(aa);
feedText.text += aa.Element("Date").Value+"'n";
feedText.text += aa.Element("Details1").Value+"'n'n";
}
foreach (var ab in objActs.Ancestors("Section1").Elements("Type2").Elements("Entry")) {
Debug.Log(ab);
feedText.text += ab.Element("Date").Value+"'n";
feedText.text += ab.Element("Details2").Value+"'n'n";
}
}
}
我最初使用if (objActs.parent.parent.name == Section 1){}方法来做这个,但这有完全相同的问题。
问题似乎是使用feedText+=,特别是因为条目最终重复自己,我得到错误"字符串太长为TextMeshGenerator。截字"。我需要在矩形中格式化它们,最终,因为我将在某些位置添加按钮,但我认为使用矩形也会产生相同的结果。
有没有人知道我如何才能得到这个正确显示文本?
我试图按照日期顺序将整个文档显示为'feed',这样,当显示为文本时,它们会出现:
条目2日期条目2详细信息
条目1日期条目1详细信息
条目3日期条目3详细信息
现在,在我的代码中,它显示为:条目1日期条目1详细信息
条目3日期条目1的详细信息(部分-这是字符串变得太长的点- foreach循环在读取所有元素后不会停止)
为此使用XML序列化
试试这个。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string input =
"<Document>" +
"<Data>3</Data>" +
"<Section1>" +
"<Type1>" +
"<Entry ID='"1'">" +
"<Date>09/8/2011</Date>" +
"<Details1>text</Details1>" +
"</Entry>" +
"<Entry ID='"3'">" +
"<Date>07/3/2012</Date>" +
"<Details2>text</Details2>" +
"</Entry>" +
"</Type1>" +
"<Type2 />" +
"<Type3>" +
"<Entry ID='"2'">" +
"<Date>08/08/2011</Date>" +
"<Details3>text</Details3>" +
"<Details4>text</Details4>" +
"</Entry>" +
"</Type3>" +
"</Section1>" +
"<Section2>" +
"<Type4 />" +
"<Type5 />" +
"</Section2>" +
"</Document>";
XDocument doc = XDocument.Parse(input);
var results = doc.Descendants().Where(s => s.Name.ToString().StartsWith("Section"))
.Where(t => t.Descendants("Date").Count() > 0).Select(u => u.Elements().Where(v => v.Descendants("Date").Count() > 0)
.Select(w => w.Elements().Select(x => new
{
element = x,
dates = (DateTime)x.Descendants("Date").FirstOrDefault()
}).ToList()).SelectMany(y => y).OrderBy(z => z.dates).ToList().Select(b => b.element).ToList()).FirstOrDefault();
}
}
}
代码显示为文本的大部分问题是由于函数在更新而不是开始时被调用。
我还稍微更改了XML格式,使节和类型成为属性,而不是子元素。生成的代码如下:
public void Feed () {
Debug.Log ("Feed initiated");
// FOR SORTING AND DISPLAYING THE DATA
XDocument xDocument = XDocument.Load (Application.persistentDataPath + "/UserData/document.xml");
// Many thanks to jdweng for suggesting using the element SortedDocument
XElement element = new XElement("SortedDocument");
var all =
from objActs in xDocument.Element("Document").Descendants("Data")
let actDate = DateTime.ParseExact(objActs.Element("Date").Value,"d/M/yyyy",new CultureInfo("en-GB"))
orderby actDate
select objActs;
foreach (var objActs in all.ToList())
{
element.Add (objActs);
} // Foreach
Debug.Log(element);
foreach (XElement sortedActs in element.Descendants("Entry")) {
if (sortedActs.Attribute("Section").Value == "Section1") {
if (sortedActs.Attribute("Type").Value == "Type1") {
feedText.text+=sortedActs.Element("Date").Value+"'n";
feedText.text+=sortedActs.Element("Details").Value+"'n'n";
}
if (sortedActs.Attribute("Type").Value == "Type2") {
feedText.text+=sortedActs.Element("Date").Value+"'n";
feedText.text+=sortedActs.Element("Details").Value+"'n'n";
}
}
}