如何以编程方式找到特定的 XML 元素?

Posted

技术标签:

【中文标题】如何以编程方式找到特定的 XML 元素?【英文标题】:How can I find a specific XML element programmatically? 【发布时间】:2020-11-27 10:39:29 【问题描述】:

我有这块 XML

<EnvelopeStatus>

  <CustomFields>
     <CustomField>
        <Name>Matter ID</Name>
        <Show>True</Show>
        <Required>True</Required>
        <Value>3</Value>
     </CustomField>
     <CustomField>
        <Name>AccountId</Name>
        <Show>false</Show>
        <Required>false</Required>
        <Value>10804813</Value>
        <CustomFieldType>Text</CustomFieldType>
     </CustomField>

我有以下代码:

// TODO find these programmatically rather than a strict path.
var accountId = envelopeStatus.SelectSingleNode("./a:CustomFields", mgr).ChildNodes[1].ChildNodes[3].InnerText;
var matterId = envelopeStatus.SelectSingleNode("./a:CustomFields", mgr).ChildNodes[0].ChildNodes[3].InnerText;

问题是,有时带有“Matter ID”的 CustomField 可能不存在。所以我需要一种方法来根据“名称是什么”来查找元素,即一种程序化的查找方式。我不能指望索引是准确的。

【问题讨论】:

【参考方案1】:

您可以使用此代码从特定元素读取内部文本:

XmlDocument doc = new XmlDocument();
doc.Load("your.xml");

XmlNodeList Nodes= doc.SelectNodes("/EnvelopeStatus/CustomField");
if (((Nodes!= null) && (Nodes.Count > 0)))
                
                    foreach (XmlNode Level1 in Nodes)
                    
                          if (Level1.ChildNodes[1].Name == "name")
                            
                             string text = Convert.ToInt32(Level1.ChildNodes[1].InnerText.ToString());
                           
                        
                        

                    
                

【讨论】:

【参考方案2】:

通过利用 .NET Framework 版本中直接提供的 XPath 功能,您通常可以在 XML 文档中找到任何内容。

也许创建一个小的 XPath 解析器帮助类

public class EnvelopeStatusParser

    public XmlNodeList GetNodesWithName(XmlDocument doc, string name)
    
        return doc.SelectNodes($"//CustomField[Name[text()='name']]");
    

然后像下面这样调用它以获取所有 Name 等于您需要搜索的内容的 CustomFields

// Creating the XML Document in some form - here reading from file
XmlDocument doc = new XmlDocument();
doc.Load(@"envelopestatus.xml");

var parser = new EnvelopeStatusParser();

var matchingNodes = parser.GetNodesWithName(doc, "Matter ID");
Console.WriteLine(matchingNodes);

matchingNodes = parser.GetNodesWithName(doc, "NotHere");
Console.WriteLine(matchingNodes);

周围有许多 XPath 备忘单 - 就像来自 LaCoupa 的这个 - xpath-cheatsheet 这对于在 XML 结构上充分利用 XPath 很有帮助。

【讨论】:

以上是关于如何以编程方式找到特定的 XML 元素?的主要内容,如果未能解决你的问题,请参考以下文章

TestNG:如何以编程方式运行自定义 TestNG.XML 文件

如何使用 Open XML 和 SAX 以编程方式检测空行?

c++ - 按特定顺序排列向量元素

如何以编程方式滚动 Android WebView

如何从 XML 元素中删除一个特定的命名空间

如何以编程方式用笔画制作圆形可绘制对象?