xml解析-编码C#xml字节解析器(用于类),一种判断I';m在父元素或子元素中
本文关键字:元素 判断 一种 C#xml 字节 编码 解析 xml 用于 | 更新日期: 2023-09-27 17:57:40
对于我的入门级C#编程类,我们本质上是在编码我们自己的XML解析器(使用FileStream和ReadByte())
我们有一个"test.xml"文件,它是。。。(我的老师将容器与父元素互换使用,并将属性用作子元素,他对我们这些懂一点xml的人来说有点困惑,但他的课针对的是那些不懂任何xml的人)
<containers>
<container>
<attribute1>data for attribute1 of container1</attribute1>
<attribute2>data for attribute2 of container1</attribute2>
<attribute3>data for attribute3 of container1</attribute3>
</container>
///more containers with varying amounts of attributes
...
</containers>
现在,在他的示例解析器中(我们应该研究并制作自己的版本,我们可以使用他的结构,但他更喜欢我们将其切换一点),他使用了一个常量
const string XMLCONTAINER = "container"
检查我们是否在父元素内部,或者我们是否正在处理容器的子元素
if(!gInsideContainer) {
if(String.Compare(gParseToken,XMLCONTAINER)==0) {
Console.WriteLine("'n***** BEG OF CONTAINER'n");
gInsideContainer=true;
// save the offset of the beginning of the
// container into the container object
setAttribute("BEGPTR",gTagOffset.ToString());
}
在我看来,这似乎是一个坏主意,因为这意味着我必须用我们最终处理的每种类型的xml编辑源代码,以确定我们是否在父元素中。我想,考虑到我们必须研究的代码,我如何做一个更通用的检查,看看我是在父元素中,还是在父元素的子元素中。
我正在考虑创建一个数组来保存打开的元素,或者创建另一个字符串变量来保存当前打开的父元素,然后检查它的关闭元素,但这可能不起作用,因为我正在考虑实现它的方法会捕获初始
<containers>
并在剩下的解析中将internalContainer设置为true(是的逻辑错误,至少我可以在编码前发现这个错误,呵呵)
我不被允许使用任何.net XML解析类,(因为我们基本上是用较少的功能重写它,可能效率较低,但更多的是他想要教授的解决问题和创建算法的经验)
关于我该如何着手实施我的想法,有什么建议吗?(记住,这里是初级程序员,哈哈)
非常感谢您的帮助和建议!
每次解析新的entry标记时,将元素推入堆栈的一种更通用的方法,并在退出时从堆栈中弹出顶部标记。如果你需要知道你的父母标签是什么,你可以偷看一下。
更好的方法是创建一个树结构,其中每个节点都包含子节点列表,每个子节点都包含到其父节点的链接,类似
public class Node
{
public string Name {get; private set;}
public List<Node> Children {get;set;}
public Node Parent {get; private set}
public int ElementDepth
{
get{ return Parent == null ? 1 : Parent.Depth + 1; }
}
public Node(string name, Node parent)
{
this.Name = name;
this.Children = new List<Node>();
this.Parent = parent;
}
public Node(byte[] xml, ref int startAt)
{
if(this.Depth == 2)
{
Console.WriteLine("In Container named '"" + this.Name +"'"");
}
/* in this function:
* Get the tag name and either (recursively) create its children
* or return if it closes this tag
*/
}
}
那么基本上,你所要做的就是将字节加载到内存中并调用Node(myArray, ref myIndexPointer)
,只要该函数定义正确,你就完成了。