从选定节点中选择返回数据所有xml

Posted

技术标签:

【中文标题】从选定节点中选择返回数据所有xml【英文标题】:Select from selected node return data all 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;
            

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于从选定节点中选择返回数据所有xml的主要内容,如果未能解决你的问题,请参考以下文章

如何从视图中返回选定的 ID,它总是将 id 1 返回到 Flask 路由

T-SQL 从 RDL 数据中选择所有 XML 节点作为行

从返回的节点的 Goutte 请求中提取特定的 xml

如何把XML里面的节点内容以DataSet的形式返回出来,求代码

返回选定的状态表,然后从另一个表中加入这些状态的计数。 SQL

XPath可以只返回具有X子节点的节点吗?