今天早上大家都在做什么?
我正在编写一个解析(几个)xml文件的程序。 该计划的这个阶段将专注于为桌面RPG(L5R)添加/编辑技能/学校/能力/等。我从这个例子中学到的东西应该让我完成整个程序的其余部分。
所以我已经使用XMLReader设置了xml读取。我正在阅读的文件看起来像......
<skills>
<skill>
<name>some name</name>
<description>a skill</description>
<type>high</type>
<stat>perception</stat>
<page>42</page>
<availability>all</availability>
</skill>
</skills>
我设置了一个包含数据的Skill类,以及一个读取数据的SkillEdit类,最终会有编辑和添加的方法。
我现在能够正确阅读所有内容,但我认为由于描述的长度可能不同,因此一旦我编写编辑方法,确保没有数据被覆盖的最佳方法就是附加已编辑的技能到文件末尾并删除其先前的条目。
为了让我这样做,我需要知道技能的文件偏移量在哪里,以及技能的文件偏移量在哪里。我似乎找不到任何方法来获得这些抵消。
有没有办法做到这一点,或者你们可以建议更好的实施来编辑已有的技能吗?
答案 0 :(得分:0)
不要这样做!通常,您无法可靠地了解序列化XML中的物理偏移,因为可能存在字符编码差异,实体引用,嵌入式注释以及可能导致物理层和逻辑层之间存在复杂关系的许多其他事物。 / p>
如果您的XML只是位于文件系统上,那么您最安全的选择是在您的技能类中有一个方法,该方法序列化为XML(您已经有一个方法可以读取XML),并在需要时重新序列化整个对象到。
答案 1 :(得分:0)
泰勒,
嗯,听起来你正在遭受过早优化的教科书案例......你是否证明从xml文件中读取和写入COMPLETE技能列表太慢了?没有?直到它被证明存在 IS NO PERFORMANCE ISSUE ,对吧?因此,我们只编写最简单的代码(即完成我们想要的代码,而不用担心性能太多),然后直接转到下一部分技巧功能......我们继续测试。Iff(这是if-and-only-if的缩写)我有一个PROVEN性能问题然后我只考虑将每个技能写入单个XML文件,以避免重写的必要性每次修改一项技能时可能有大量技能......但这是“参考数据”,对吧?我的意思是你不会将你的(易变的)游戏数据序列化/从XML文件中序列化,是吗?因为已知RDBMS在这项工作上要好得多,对吧?所以你不会经常重写这个文件吗?
干杯。基思。
答案 2 :(得分:0)
如果您将XML读入LINQ to XML的XDocument
(或XElement
),一切都会变得非常简单。您可以使用简单的界面阅读,编辑,添加内容等XML文件。
如,
var xmlStr = @"<skills>
<skill>
<name>some name</name>
<description>a skill</description>
<type>high</type>
<stat>perception</stat>
<page>42</page>
<availability>all</availability>
</skill>
</skills>
";
var doc = XDocument.Parse(xmlStr);
// find the skill "some name"
var mySkill = doc
.Descendants("skill") // out of all skills
.Where(e => e.Element("name").Value == "some name") // that has the element name "some name"
.SingleOrDefault(); // select it
if (mySkill != null) // if found...
{
var skillType = mySkill.Element("type").Value; // read the type
var skillPage = (int)mySkill.Element("page"); // read the page (as an int)
mySkill.Element("description").Value = "an AWESOME skill"; // change the description
// etc...
}
无需计算偏移量,手动,逐步阅读或维持其他状态,这一切都得到了照顾。