C# XmlTextReader,读取元素的子元素(或父元素?)
编辑:从XmlTextWriter切换到XElement 我有一个Player类,它有以下变量:C# XmlTextReader,读取元素的子元素(或父元素?),c#,xml,textreader,C#,Xml,Textreader,编辑:从XmlTextWriter切换到XElement 我有一个Player类,它有以下变量: static string Name; static int Level; static int Cash; 我用XElement将它们保存到一个“Profiles.xml”文件中,现在看起来如下所示: <John> <level>3</level> <cash>215</cash> </John> <
static string Name;
static int Level;
static int Cash;
我用XElement将它们保存到一个“Profiles.xml”文件中,现在看起来如下所示:
<John>
<level>3</level>
<cash>215</cash>
</John>
<Mike>
<level>7</level>
<cash>780</cash>
</Mike>
3.
215
7.
780
现在如果我有名字,fe。Mike,我如何获得现金和水平?使用xml序列化,这一切都会消失 要按常规序列化:
public string Serialise(T someObject)
{
XmlSerializer ser = new XmlSerializer(typeof (T));
MemoryStream memStream = new MemoryStream();
XmlConfigTextWriter xmlWriter = new XmlConfigTextWriter(memStream, Encoding.UTF8);
xmlWriter.Namespaces = true;
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", ""); //we don't want namespace data here.
ser.Serialize(xmlWriter, someObject, ns);
xmlWriter.Close();
memStream.Close();
string xml = Encoding.UTF8.GetString(memStream.GetBuffer());
xml = xml.Substring(xml.IndexOf(Convert.ToChar(60)));
xml = xml.Substring(0, (xml.LastIndexOf(Convert.ToChar(62)) + 1));
return xml;
}
以及反序列化:
public T Deserialise(string objectXml)
{
XmlSerializer reader = new XmlSerializer(typeof (T));
StringReader stringReader = new StringReader(objectXml);
XmlTextReader xmlReader = new XmlTextReader(stringReader);
return (T) reader.Deserialize(xmlReader);
}
给你
XDocument doc = XDocument.Parse(@"
<Players><John>
<level>3</level>
<cash>215</cash>
</John>
<Mike>
<level>7</level>
<cash>780</cash>
</Mike>
</Players>");
var players = doc.Root.Elements();
foreach (var player in players)
{
if (player.Name.ToString() == "Mike")
{
Console.WriteLine(player.Element("level"));
Console.WriteLine(player.Element("cash"));
}
}
XDocument doc=XDocument.Parse(@)
3.
215
7.
780
");
var players=doc.Root.Elements();
foreach(玩家中的var玩家)
{
if(player.Name.ToString()=“Mike”)
{
Console.WriteLine(player.Element(“level”);
Console.WriteLine(player.Element(“现金”));
}
}
创建控制台应用程序并使用LINQ to XML
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
namespace ConsoleApplication8
{
public class Player
{
public string Name { get; set; }
public int level { get; set; }
public int cash { get; set; }
}
class Program
{
static void Main(string[] args)
{
// you may have several players like below
List<Player> Players = new List<Player>() {
new Player() { Name = "John", cash = 3, level = 215 },
new Player() { Name = "Mike", level = 7, cash = 780 }
};
// save them to Xml file
Save("players.xml", Players);
//when you need details of a given player "Mike"
Player PlayersMike = Load("players.xml", "Mike");
// Adding new player
AddPlayer("players.xml", new Player() { Name = "Test", level = 1, cash = 780 });
}
/// <summary>
/// Saves the specified XML file with players data
/// </summary>
/// <param name="xmlFile">The XML file.</param>
/// <param name="Players">The players.</param>
public static void Save(string xmlFile, List<Player> Players)
{
XElement xml = new XElement("Players",
from p in Players
select new XElement("Player",
new XElement("Name", p.Name),
new XElement("level", p.level),
new XElement("cash", p.cash)));
xml.Save(xmlFile);
}
/// <summary>
/// Loads the specified XML file.
/// </summary>
/// <param name="xmlFile">The XML file.</param>
/// <returns></returns>
public static Player Load(string xmlFile, string name)
{
XDocument doc = XDocument.Load(xmlFile);
var query = (from xElem in doc.Descendants("Player")
where xElem.Element("Name").Value.Equals(name)
select new Player
{
Name = xElem.Element("Name").Value,
level = int.Parse(xElem.Element("level").Value),
cash = int.Parse(xElem.Element("cash").Value),
}).FirstOrDefault();
return query;
}
/// <summary>
/// Adds the player.
/// </summary>
/// <param name="xmlFile">The XML file.</param>
/// <param name="p">The p.</param>
public static void AddPlayer( string xmlFile, Player p)
{
XDocument doc = XDocument.Load(xmlFile);
doc.Element("Players").Add(
new XElement("Player",
new XElement("Name", p.Name),
new XElement("level", p.level),
new XElement("cash", p.cash)));
doc.Save(xmlFile);
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml.Linq;
命名空间控制台应用程序8
{
公开课选手
{
公共字符串名称{get;set;}
公共整数级别{get;set;}
public int cash{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
//您可能有以下几个玩家
列表玩家=新列表(){
新玩家(){Name=“John”,现金=3,等级=215},
新玩家(){Name=“Mike”,等级=7,现金=780}
};
//将它们保存到Xml文件中
保存(“players.xml”,players);
//当你需要特定玩家“迈克”的详细信息时
Player PlayersMike=Load(“players.xml”、“Mike”);
//添加新玩家
AddPlayer(“players.xml”,newplayer(){Name=“Test”,级别=1,现金=780});
}
///
///使用播放器数据保存指定的XML文件
///
///XML文件。
///球员们。
公共静态void保存(字符串xmlFile,列表播放器)
{
XElement xml=新XElement(“玩家”,
从p开始
选择新元素(“玩家”,
新XElement(“名称”,p.Name),
新元素(“级别”,p.level),
新货币(“现金”,p.cash));
Save(xmlFile);
}
///
///加载指定的XML文件。
///
///XML文件。
///
公共静态播放器加载(字符串xmlFile,字符串名称)
{
XDocument doc=XDocument.Load(xmlFile);
var query=(来自doc.substands(“Player”)中的xElem)
其中xElem.Element(“Name”).Value.Equals(Name)
选择新玩家
{
Name=xElem.Element(“Name”).Value,
level=int.Parse(xElem.Element(“level”).Value),
cash=int.Parse(xElem.Element(“cash”).Value),
}).FirstOrDefault();
返回查询;
}
///
///添加玩家。
///
///XML文件。
///p。
公共静态void AddPlayer(字符串xmlFile,Player p)
{
XDocument doc=XDocument.Load(xmlFile);
文档元素(“玩家”)。添加(
新XElement(“玩家”,
新XElement(“名称”,p.Name),
新元素(“级别”,p.level),
新货币(“现金”,p.cash));
doc.Save(xmlFile);
}
}
}
首先,您不应该使用新的XmlTextReader()
。使用XmlReader.Create()
。其次,XmlReader
是读取XML最困难的方法。你不使用LINQ to XML或至少是XmlDocument
有什么原因吗?我没有理由不使用LINQ,只是改用了它,但从google找不到任何清晰的教程,关于如何获取信息,我只能写它:/I我敦促你停止使用google来获取供应商已经记录的主题的教程。看见用于加载XML。现在我需要额外的标记,这太糟糕了。但我们正在取得进展,这是迄今为止最好的答案,如果你能做到这一点,它是完美的。Nvm,我自己修复了它,编辑了主要帖子,谢谢:)你的整个XML文件看起来怎么样?如果没有Players标记,则缺少根元素,如果没有根元素,则无法使用XElement。而且它也不是一个格式良好的XML。仍然有10亿个问题,当不能有多个根元素时,我如何在标记中添加新的播放器?这也是可行的,但是我如何在已经存在的文件中添加新的播放器,如果不创建一个新的,我就无法做到:/make了一个全新的问题:P