XMLTextReader 获取孩子
Posted
技术标签:
【中文标题】XMLTextReader 获取孩子【英文标题】:XMLTextReader get children 【发布时间】:2014-10-13 06:48:25 【问题描述】:我是新的 ti XML,但我正在努力学习一些基础知识。
我有一个读取文档的 XMLTextReader:
<node guid="e7071d4d-21b0-48c0-b803-daf202998633" tag="3DMesh" imageindex="1" text="body__6557_0"/>
<node guid="3bc0240f-cdf4-4e09-94de-a52d7bc0c4be" tag="3DMesh" imageindex="1" text="body__6558_0"/>
<node guid="59dd7ce9-176c-4a45-a45d-b632b675b6c9" tag="3DMesh" imageindex="1" text="body__6581_0"/>
<node guid="66166789-3500-46ef-b43b-34919481ad37" tag="3DMesh" imageindex="1" text="body__6582_0"/>
<node guid="95882524-a9a6-4a50-a3bc-fe7c31ef2e47" tag="3DMesh" imageindex="1" text="Fixed_Support_OD_610_1__1_0"/>
<node tag="GroupNode" imageindex="3" text="Group">
<node guid="295e5a94-3732-4b3d-81f4-b04636eb71c3" tag="3DMesh" imageindex="1" text="a_11_1__9_0"/>
<node guid="f56472cc-dd46-44c8-997f-113cb959661d" tag="3DMesh" imageindex="1" text="a_12_1__9_0"/>
</node>
<node guid="2ebcd33a-f8e7-46ea-b637-2b7e3120a7da" tag="3DMesh" imageindex="1" text="Rod_Hanger_610_1_0"/>
<node guid="9221b254-fe4c-4c10-b6d2-da21a46eeb56" tag="3DMesh" imageindex="1" text="Rod_Hanger_610_2_0"/>
<node guid="38b0b0ef-0a62-4392-a607-ce1e708503a3" tag="3DMesh" imageindex="1" text="Single_variable_spring_hanger1_610_1_0"/>
<node guid="c41ab0c6-2f91-4595-b015-204675d8eaa4" tag="3DMesh" imageindex="1" text="Single_variable_spring_hanger1_610_2_0"/>
<node guid="1a01282c-c82f-4c63-afc4-35636972b499" tag="3DMesh" imageindex="1" text="Single_variable_spring_hanger1_610_3_0"/>
我到达“GroupNode”,然后我需要保存子元素的 GUID。 为此...我正在考虑遍历它们并获取我需要的信息。
我似乎无法获得孩子的数量,因此我可以通过它们进行 forloop。
请帮忙。
在这里我反序列化文件并从 XML 创建树结构(3D)。
public void Deserialize(UserControl_Designer_Tree TreeView, string FileName)
XmlTextReader reader = null;
try
TreeView.Multiselect_Tree_View.BeginUpdate(); //Disabling re-drawing of treeview till all nodes are added.
reader = new XmlTextReader(FileName);
TreeNode parentNode = null;
while (reader.Read())
if (reader.NodeType == XmlNodeType.Element)
if (reader.Name == XmlNodeTag)
TreeNode newNode = new TreeNode();
bool isEmptyElement = reader.IsEmptyElement;
newNode = Node_Create(reader, TreeView);
.........
以下 sn-p 来自我返回节点类型的 Node_Create() 方法。
if (nodeTag == "GroupNode")
XmlDocument doc = new XmlDocument();
XmlNode myNode = doc.ReadNode(Reader); //Get current group node
List<string> meshGUIDs = new List<string>();
int y = myNode.ChildNodes.Count; //The the amount of nodes in that group
if (y > 0)
for (int a = 0; a < y; a++)
Reader.Read();
nodeGuid = Reader.GetAttribute(XmlNodeGuidAttribute);
meshGUIDs.Add(nodeGuid);
List<Basic_Mesh> meshes = new List<Basic_Mesh>(meshGUIDs.Count);
foreach (string meshGuiD in meshGUIDs)
Basic_Mesh mesh = Mesh_Guid_Search(Tree.Designer_3D._3DModels_List, meshGuiD);
meshes.Add(mesh);
Group_Data groupData = Tree.Designer_3D._3DGrouping.Create("Group", meshes); //Create a Basic_Group object in the clarity control.
return new Group_Node(nodeText, new List<Mesh_Node>(), groupData);
【问题讨论】:
当您进入这部分代码时,您的Reader
处于什么状态? Reader
在本节之前会发生什么?
这是完整的 XML 还是只是其中的一部分?文档中是否会有多个“GroupNode”节点?
这不是完整的 XML。可以有多个“组节点”和任意数量的“子节点”。
在上一节之前用代码更新了帖子。
【参考方案1】:
这对我有用...
while (Reader.Read())
if (Reader.NodeType == XmlNodeType.EndElement)
break;
nodeGuid = Reader.GetAttribute(XmlNodeGuidAttribute);
meshGUIDs.Add(nodeGuid);
不知道这是否是最好的方法,但它适用于我的情况。
谢谢。
【讨论】:
以上是关于XMLTextReader 获取孩子的主要内容,如果未能解决你的问题,请参考以下文章
找不到 XmlTextReader/XmlNodeType 命名空间,如何解决?
如何在 C# 中使用 XmlTextReader 识别短标签?
SAX 与 XmlTextReader - C# 中的 SAX
为啥 XmlReader 中的默认编码与 XmlTextReader 默认编码的行为不同?
XmlTextReader 忽略第二个和第三个 Profile 元素
在 C# Compact Framework 中加速 XML 的解析(使用 XmlTextReader 和 XElement)?