简体   繁体   English

XmlReader如何正确阅读?

[英]XmlReader How to read properly?

what is the best way to read xml like this one: 像这样读取xml的最佳方法是什么:

<Users>
<user name = "mail">
    <supplier name = "supp1">
        <project name = "proj1">
            <subscribe name= "sub1"/>
            <subscribe name = "sub2"/>
        </project>
    </supplier>
    <supplier name = "supp2">
        <project name = "proj2">
            <subscribe name = "sub3"/>
        </project>
        <project name = "proj3">
            <subscribe name= "sub4"/>
            <subscribe name = "sub5"/>
        </project>
        <project name = "proj4"/>
    </supplier>
    <supplier name = "supp3"/>
            <supplier name = "supp5">
                 <project name = "proj4"/>
    <supplier name = "supp4"/>
</user>
</Users>

For now I am using 现在我正在使用

 While(reader.Read())
 {
    if (((reader.NodeType == XmlNodeType.EndElement) && (reader.Name == "user")))
     break;

            if ((reader.NodeType == XmlNodeType.Element) && (reader.Name =="supplier"))
            {
                foreach (TreeNode tree in TreeView1.Nodes)
                {
                    if (reader.GetAttribute(0) == tree.Text)
                    {
                        TreeView1.SelectedNode = tree;
                        TreeView1.SelectedNode.Checked = true;

                        Get_projects(reader, tree);

                        break;
                    }
                }
            }
}

this is the main after that is get_projects(...): 这是主要的,之后是get_projects(...):

private void Get_projects(XmlReader reader, TreeNode tree)
    {
        while (reader.Read())
        {
            if ((reader.NodeType == XmlNodeType.EndElement) && (reader.Name ==  "supplier")) break;
                //(reader.IsEmptyElement && reader.Name == "supplier")
            if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "project"))
            {
                foreach (TreeNode projTree in tree.Nodes)
                {
                    if (reader.GetAttribute(0) == projTree.Text)
                    {
                        TreeView1.SelectedNode = projTree;
                        TreeView1.SelectedNode.Checked = true;

                        Get_subscribes(reader, projTree);
                        break;
                    }
                }
            }
        }
    }

the Get_subscribes(reader, projTree): Get_subscribes(阅读器,projTree):

private void Get_subscribes(XmlReader reader, TreeNode tree)
    {
        while (reader.Read())
        {
             if ((reader.NodeType == XmlNodeType.EndElement) && (reader.Name ==   "project") ||
                (reader.IsEmptyElement && reader.Name == "project")) break;
            if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "subscribe"))
            {
                foreach (TreeNode subTree in tree.Nodes)
                {
                    if (reader.GetAttribute(0) == subTree.Text)
                    {
                        TreeView1.SelectedNode = subTree;
                        TreeView1.SelectedNode.Checked = true;

                        break;
                    }
                }
            }
        }
    }

It doesn't work, so I am wondering is there a better way or what am i missing? 它不起作用,所以我想知道是否有更好的方法,或者我缺少什么?

I will give you sample to read properly 我会给你样本以便正确阅读

<ApplicationPool>
    <Accounts>
        <Account>
            <NameOfKin></NameOfKin>
            <StatementsAvailable>
                <Statement></Statement>
            </StatementsAvailable>
        </Account>
    </Accounts>
</ApplicationPool>

static IEnumerable<XElement> SimpleStreamAxis(string inputUrl,                                          string elementName)
{
  using (XmlReader reader = XmlReader.Create(inputUrl))
  {
    reader.MoveToContent();
    while (reader.Read())
    {
      if (reader.NodeType == XmlNodeType.Element)
      {
        if (reader.Name == elementName)
        {
          XElement el = XNode.ReadFrom(reader) as XElement;
          if (el != null)
          {
            yield return el;
          }
        }
      }
    }
  }
}


using (XmlReader reader = XmlReader.Create(inputUrl))
{
    reader.ReadStartElement("theRootElement");

    while (reader.Name == "TheNodeIWant")
    {
        XElement el = (XElement) XNode.ReadFrom(reader);
    }

    reader.ReadEndElement();
}

Source: Reading Xml with XmlReader in C# 来源: 在C#中使用XmlReader读取Xml

Hope this help. 希望能有所帮助。

I would consider the reverse approach ie: instead of reading XML and checking if a node exists in TreeView I would prefer to use XPath to check if a node exists in XML document. 我会考虑相反的方法,即:与其阅读XML并检查TreeView中是否存在节点,不如使用XPath来检查XML文档中是否存在节点。

In order to do so you have to traverse TreeView nodes and for each node build XPath query 为此,您必须遍历TreeView节点,并为每个节点构建XPath查询

eg: /Users/user/supplier[@name='supp1']/project[@name='proj1']. 例如:/ Users / user / supplier [@ name ='supp1'] / project [@ name ='proj1']。

Having XPath query you can create an instance of XPathDocument based on your XMLReader and run the query. 使用XPath查询,您可以基于XMLReader创建XPathDocument实例并运行查询。 If something is found, you will check current node in TreeView. 如果找到了某些内容,则将在TreeView中检查当前节点。

you can try XPath to read informations you need 您可以尝试使用XPath读取所需的信息

XMLDocument doc = new XMLDocument();
doc.Load(your_xml_file_path);
XMLNodeList list = doc.SelectNodes(@"//project"); //get all project element

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM