正在从XMLReader获取元素偏移量

本文关键字:元素 偏移量 获取 XMLReader | 更新日期: 2023-09-27 17:59:04

大家今天早上过得怎么样?

我正在编写一个程序来解析(几个)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类和一个读取数据的SkilEdit类,最终将拥有编辑和添加的方法。

我目前能够正确阅读所有内容,但我曾想过,由于描述的长度可能会有所不同,一旦我编写了编辑方法,确保没有数据被覆盖的最佳方法就是将编辑后的技能附加到文件的末尾,并删除其以前的条目。

为了做到这一点,我需要知道skill的文件偏移量在哪里,/skill的文件偏移值在哪里。不过,我似乎找不到任何方法来获得这些偏移量。

有没有办法做到这一点,或者你们能建议一个更好的方法来编辑现有的技能?

正在从XMLReader获取元素偏移量

如果将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...
}

无需计算偏移、手动、逐步读取或维护其他状态,一切都由您负责。

不要这么做!通常,您无法可靠地了解序列化XML中的物理偏移,因为可能存在字符编码差异、实体引用、嵌入注释以及许多其他可能导致物理层和逻辑层之间存在复杂关系的因素。

如果您的XML只是位于文件系统上,那么最安全的选择是在您的技能类中有一个方法序列化为XML(您已经有了一个方法来读取XML),并在需要时重新序列化整个对象

Tyler,

嗯,听起来你正在遭受一个过早优化的教科书案例。。。你有没有证明在xml文件中读写完整的技能列表太慢了?不在证明不存在性能问题之前,对吧?因此,我们只需编写最简单的代码即可工作(即,做我们想要的事情,而不必太担心性能),然后直接转到下一个技巧功能。。。一边测试。

如果f(它是if和only if的缩写)我当时遇到了一个已验证的性能问题,只有到那时我才会考虑将每项技能写入单个XML文件,以避免每次修改一项技能时都需要重写一个潜在的大量技能列表。。。但这是"参考数据",对吧?我的意思是,你不会将你的(易失性)游戏数据反序列化到XML文件中,对吗?因为众所周知,RDBMS在这方面做得更好,对吧?所以你不会经常重写这个文件吗?

干杯。基思。