【问题标题】:Check if XML Element exists检查 XML 元素是否存在
【发布时间】:2010-09-11 04:44:07
【问题描述】:

如何验证特定元素是否存在于 XML 文件中?假设我有一个不断变化的 XML 文件,我需要在读取/解析它之前验证每个元素是否存在。

【问题讨论】:

    标签: c# xml


    【解决方案1】:
    if(doc.SelectSingleNode("//mynode")==null)....
    

    应该这样做(其中 doc 显然是您的 XmlDocument 对象)

    或者,您可以使用 XSD 并针对它进行验证

    【讨论】:

    • “//”代表什么?
    • @Qsiris "//" 是 XPath,意思是选择任何元素 mynode,无论它在哪里
    【解决方案2】:

    您可以遍历每个节点并查看是否存在节点。

    doc.Load(xmlPath);
            XmlNodeList node = doc.SelectNodes("//Nodes/Node");
            foreach (XmlNode chNode in node)
            {
                try{
                if (chNode["innerNode"]==null)
                    return true; //node exists
                //if ... check for any other nodes you need to
                }catch(Exception e){return false; //some node doesn't exists.}
            }
    

    您遍历 Nodes 下的每个 Node 元素(比如说这是根)并检查是否存在名为“innerNode”的节点(如果需要,添加其他节点)。 try..catch 是因为我怀疑如果节点不存在,这会引发流行的“未设置对象引用”错误。

    【讨论】:

      【解决方案3】:

      //如果问题是“只是”在您之前验证该元素是否存在于 xml 文件中 //提取你可以这样做的值

      XmlNodeList YOURTEMPVARIABLE = doc.GetElementsByTagName("YOUR_ELEMENTNAME");
      
              if (YOURTEMPVARIABLE.Count > 0 )
              {
                  doctype = YOURTEMPVARIABLE[0].InnerXml;
      
              }
              else
              {
                  doctype = "";
              }
      

      【讨论】:

        【解决方案4】:

        不确定您想要做什么,但使用 DTD 或架构可能是您验证 xml 所需要的全部内容。

        否则,如果您想查找一个元素,您可以使用 xpath 查询来搜索特定元素。

        【讨论】:

        • “如何”问题的答案在哪里
        • @sam - 这个问题不是特别清楚,所以给出一些提示是非常好的恕我直言。在 xpath 或 dtd 上进一步搜索会得到比你能动摇的更多的代码!你有什么特别的问题吗?我会尽力帮忙的。
        【解决方案5】:

        试试这个怎么样:

        using (XmlTextReader reader = new XmlTextReader(xmlPath))
        {
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                { 
                    //do your code here
                }
            }
        }
        

        【讨论】:

          【解决方案6】:

          除了sangam 代码

          if (chNode["innerNode"]["innermostNode"]==null)
                      return true; //node    *parentNode*/innerNode/innermostNode exists
          

          【讨论】:

            【解决方案7】:

            您可以通过使用 XML 模式语言(例如 XSD)来验证这一点以及更多内容。

            如果您的意思是有条件地在代码中,那么XPath 也值得一看。

            【讨论】:

              【解决方案8】:

              以下是一个简单的函数,用于检查 xml 文件中是否存在特定节点。

              public boolean envParamExists(String xmlFilePath, String paramName){
                  try{
                      Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(xmlFilePath));
                      doc.getDocumentElement().normalize();
                      if(doc.getElementsByTagName(paramName).getLength()>0)
                          return true;
                      else
                          return false;
                  }catch (Exception e) {
                      //error handling
                  }
                  return false;
              }
              

              【讨论】:

                【解决方案9】:

                有点晚了,但如果有帮助,这对我有用...

                XmlNodeList NodoEstudios = DocumentoXML.SelectNodes("//ALUMNOS/ALUMNO[@id=\"" + Id + "\"]/estudios");
                
                string Proyecto = "";
                
                foreach(XmlElement ElementoProyecto in NodoEstudios)
                {
                    XmlNodeList EleProyecto = ElementoProyecto.GetElementsByTagName("proyecto");
                    Proyecto = (EleProyecto[0] == null)?"": EleProyecto[0].InnerText;
                }
                

                【讨论】:

                  【解决方案10】:

                  //使用XmlReader检查xml元素值是否存在

                            using (XmlReader xmlReader = XmlReader.Create(new StringReader("XMLSTRING")))
                             {
                  
                                 if (xmlReader.ReadToFollowing("XMLNODE")) 
                  
                                  {
                                      string nodeValue = xmlReader.ReadElementString("XMLNODE");                
                                  }
                              }     
                  

                  【讨论】:

                    【解决方案11】:

                    刚刚遇到了同样的问题,null-coalescing operatorSelectSingleNode 发挥了作用,用 string.Empty 分配 null

                     foreach (XmlNode txElement in txElements)
                     {
                         var txStatus = txElement.SelectSingleNode(".//ns:TxSts", nsmgr).InnerText ?? string.Empty;
                         var endToEndId = txElement.SelectSingleNode(".//ns:OrgnlEndToEndId", nsmgr).InnerText ?? string.Empty;
                         var paymentAmount = txElement.SelectSingleNode(".//ns:InstdAmt", nsmgr).InnerText ?? string.Empty;
                         var paymentAmountCcy = txElement.SelectSingleNode(".//ns:InstdAmt", nsmgr).Attributes["Ccy"].Value ?? string.Empty;
                         var clientId = txElement.SelectSingleNode(".//ns:OrgnlEndToEndId", nsmgr).InnerText ?? string.Empty;
                         var bankSortCode = txElement.SelectSingleNode(".//ns:OrgnlEndToEndId", nsmgr).InnerText ?? string.Empty; 
                    
                         //TODO finish Object creation and Upsert DB
                      }
                    

                    【讨论】:

                      【解决方案12】:
                       string name = "some node name";
                          var xDoc = XDocument.Load("yourFile");
                          var docRoot = xDoc.Element("your docs root name");
                      
                           var aNode = docRoot.Elements().Where(x => x.Name == name).FirstOrDefault();
                                      if (aNode == null)
                                      {
                                          return $"file has no {name}";
                                      }
                      

                      【讨论】:

                        【解决方案13】:

                        //我发现子节点 ERNO 排在倒数第二位

                        If StrComp(xmlnode(i).ChildNodes.Item(xmlnode(i).ChildNodes.Count - 1).Name.ToString(), "ERNO", CompareMethod.Text) = 0 Then
                                        xmlnode(i).ChildNodes.Item(xmlnode(i).ChildNodes.Count - 1).InnerText = c
                                    Else
                                        elem = xmldoc.CreateElement("ERNo")
                                        elem.InnerText = c.ToString
                                        root.ChildNodes(i).AppendChild(elem)
                                    End If
                        

                        【讨论】:

                        • 请确保在发布答案之前格式化代码块,因为在当前状态下它是不可读的。
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-11-20
                        相关资源
                        最近更新 更多