【问题标题】:Select from selected node return data all xml从选定节点中选择返回数据所有xml
【发布时间】:2018-09-29 21:23:02
【问题描述】:

有 XML 设置

<?xml version="1.0" encoding="utf-8" ?>
    <TablesConfig>  
      <Logs>
        <Table name="T_1" key="id">
          <FieldsSearch>
            <Field>All</Field>        
          </FieldsSearch>
          <LinksDetail>
            <Link table="t_Det11" key ="id" srcKey="id_request" sortField ="id"/>
            <Link table="t_Det12" key ="id" srcKey="id_request" sortField ="id"/>
            <Link table="t_Det13" key ="id" srcKey="id_request" sortField ="id"/>      
          </LinksDetail>
        </Table>
        <Table name="T_2" key="id">
          <FieldsSearch>
            <Field>All</Field>        
          </FieldsSearch>

          <LinksDetail>
            <Link table="t_Det21"  key ="id" srcKey="operid" sortField ="id"/>
            <Link table="t_Det22" key ="id" srcKey="operid" sortField ="id"/>      
          <Link table="t_Det22"   key ="id" srcKey="operid" sortField ="id"/>
          </LinksDetail>
        </Table>
  </Logs>
</TablesConfig>

在 TableSettings 的代码中,我选择了一个节点,在 getFiltersList 中,我想从 FieldsSearch 选定的节点中获取列表,但 node.SelectNodes("//FieldsSearch/Field") 返回 2 行。为什么? 我可以选择一个节点并使用它吗?

Class TableSettings{
    XmlNode node;
    public TableSettings(string TableName) {
                doc = new XmlDocument();
                tabSettingsPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\ExtFiles\\TablesConf.xml";
                doc.Load(tabSettingsPath);
                node = doc.SelectSingleNode("//Table[@name='"+TableName+"']"); 
            }
            public List<string> getFiltersList() {
                List<string> filtersList = new List<string>();
                foreach (XmlNode inNode in node.SelectNodes("//FieldsSearch/Field")) {
                    filtersList.Add(inNode.FirstChild.Value);
                }
                return filtersList;
            }
}

【问题讨论】:

    标签: c# xml xmlnode


    【解决方案1】:

    您不是在检查所选节点的子节点,而是检查根节点的所有后代节点。您可以将其更正为:

    public List<string> getFiltersList(XmlNode node)
    {
        List<string> filtersList = new List<string>();
        foreach (XmlNode inNode in node.SelectNodes("FieldsSearch/Field"))
        {
            filtersList.Add(inNode.FirstChild.Value);
        }
        return filtersList;
    }
    

    【讨论】:

    • 我的错误节点是类中的全局变量。当我在 Debug 中检查 innerXml 时,我看到正确的 xml 与节点中的一个表
    • @dMazay,全局或本地无关紧要,您没有搜索其子节点。无论如何,最好不要在顶层使用这样的变量,而是作为参数传递。
    • 一开始我调用 TableSettings 然后 getFiltersList 和 node 已经会初始化了
    【解决方案2】:

    路径 // 从根开始。 对于使用 currentnode 需要使用 .// - 从当前节点“.//FieldsSearch/Field”开始 或者只使用“FieldsSearch / Field”

    public List<string> getFiltersList()
    {
        List<string> filtersList = new List<string>();
        foreach (XmlNode inNode in node.SelectNodes(".//FieldsSearch/Field"))
        {
            filtersList.Add(inNode.FirstChild.Value);
        }
        return filtersList;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-28
      • 1970-01-01
      • 2014-11-25
      • 2011-08-10
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多