C# 正确使用xml中的自定义id代码,以便导入和重写c语言#
我是一名刚刚学习xml和c的学生。我正在编写一个程序,它将读入xml数据,对其进行处理,然后将其写回xml。相当标准的东西。具体来说,该程序将允许用户根据我的一位朋友的请求,为L5R tapletop RPG游戏创建/生成角色并添加新类型的信息(部落、技能、奖金等)。这是一次学习经历,当我完成时,它会给我一些东西放在我的投资组合中 我首先创建xsd和xml,完成后将通过伪代码阶段 在我的XML中,我正在做一些类似于C# 正确使用xml中的自定义id代码,以便导入和重写c语言#,c#,xml,C#,Xml,我是一名刚刚学习xml和c的学生。我正在编写一个程序,它将读入xml数据,对其进行处理,然后将其写回xml。相当标准的东西。具体来说,该程序将允许用户根据我的一位朋友的请求,为L5R tapletop RPG游戏创建/生成角色并添加新类型的信息(部落、技能、奖金等)。这是一次学习经历,当我完成时,它会给我一些东西放在我的投资组合中 我首先创建xsd和xml,完成后将通过伪代码阶段 在我的XML中,我正在做一些类似于 <clan clID="clanX"> <clName&g
<clan clID="clanX">
<clName>...</clname>
<bonus bnID="clXbonusX>
<bnName>...</bnName>
<modBy>someNum</modBy>
</bonus>
</clan>
...
在ID中插入具有实际数据的元素名称似乎是多余的。。您已经知道clan
元素中的clID
是用于clan
元素的,所以只需将您的X
而不是整个clanX
。bnID
元素也是如此
这样,您甚至可以通过从“ID”提取实际信息(X
)来保存
一旦我开始实际编程,ID字符串将根据用户输入的新氏族和奖金名称等而改变
可以更改的ID不是真正的ID。从您对Shekhar_Pro的回答的评论来看,您的想法似乎是ID在XML文档的范围内必须是唯一的。当且仅当您在DTD或模式中使用ID约束时,这是正确的。ID约束并不是一个非常常见的用例,我不认为这是一个
更大的问题是:你真的需要身份证吗?例如,假设氏族的名称和特征不会随着时间的推移而改变-可能会添加新的,但AEG不会很快改变旧的-如果您的文档如下所示:
<clan name="Scorpion">
<bonus trait="Honor" value="-1"/>
<bonus trait="Intelligence" value="+1"/>
</clan>
在您的模式中,您可以使用以下命令指示族名称需要唯一:
<xsd:element name="clan" type="clanType">
<xsd:unique name="nameKey">
<xsd:selector xpath="*/clan"/>
<xsd:field xpath="@name"/>
</xsd:unique>
</xsd:element>
您可能需要在选择器中使用XPath,这取决于clan
元素在文档中的位置。我的理解是,我不能让ID相同,因为如果clan ID的ID“1”已经存在,那么子元素中的额外ID为“1”在按自定义ID搜索元素时会导致冲突吗?很好,这看起来更简洁、更高效(你对L5R的了解给我留下了深刻的印象^。^)我不知道xpath是什么,但我有一种感觉,当涉及到*/和//clam时,我也将开始学习lol[@…那是目录符号吗?这是我一直想知道的事情,但我记不起来/找不到一个如何在不使用整个c:\\blahblah\blah的情况下为路径编程的列表(我不记得正确的术语,所以谷歌是个婊子)我查阅了更多信息,我不确定我是否会使用xpath,因为在我的程序中,我将使用Linq to xml,那么我还会在模式中使用xpath条目吗?此外,您使用了type=“clanType”,我不确定确切地如何声明类型(到目前为止,我的模式非常基本)我对上面的内容有点困惑,clan是否需要是一个复杂类型,或者我是否应该将其放在/unique之后?我了解了发生的事情的要点,使用属性而不是元素作为值,但是对于如何确保它们是唯一的,我仍然有点困惑。您可以将XPath与Linq结合使用;您也可以执行同样的操作使用纯Linq方法,例如doc.substands(“clan”).Where(x=>x.GetAttribute(“name”)==“Scorpion”).FirstOrDefault()
将返回该clan
元素,如果该名称的元素不存在,则返回null。是的,您需要将clanType
声明为复杂类型-这就是您指示clan
有一个或多个奖金
子元素的方式。最后,您可能会感兴趣:
<xsd:element name="clan" type="clanType">
<xsd:unique name="nameKey">
<xsd:selector xpath="*/clan"/>
<xsd:field xpath="@name"/>
</xsd:unique>
</xsd:element>