【问题标题】:Get all tags of the same tag name regardless of level in XML File with C#使用 C# 获取具有相同标签名称的所有标签,无论 XML 文件中的级别如何
【发布时间】:2020-10-06 14:04:42
【问题描述】:

我有下面的方法和下面的xml文件。 该方法过滤所有“Tag4”元素的内容并将其插入到列表中。 不幸的是,我遇到的问题是,对于几个子元素,该方法不再有效。 然后只有内容:“Content1”被添加到列表中,其余的被忽略。

方法:

public List<string> Method(string sourcePath)
{
    string directory = sourcePath;
    var resultList = new List<string>();

    try
    {
        XDocument xdocument = XDocument.Load(directory);
        IEnumerable<XElement> tags = xdocument.Root.Elements().Elements().Where(x => x.Name.LocalName.Equals("Tag4"));
        foreach (var tag in tags)
        {
            var value = tag?.Value;
            if (!string.IsNullOrEmpty(value) && !resultList.Contains(value))
            {
                resultList.Add(value);
            }
        }
    }
    catch (Exception ex)
    {
    }
    return resultList;
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<Tag1Group xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsinc="http://www.w3.org/2001/XInclude" validFrom="2020-03-26T00:00:00+01:00" version="4" subversion="22" xmlns="http://www.bmw.com/ista/v2">
  <Tag1 name="Content1" version="4" Subversion="22">
    <Tag2>
      <Tag1 name="Content2" version="4" subversion="22">
        <Tag2>
          <Tag1 name="Content3" version="4" subversion="22">
            <Tag2>
              <Tag1 name="Content4" version="4" subversion="22">
                <Tag3>Ex</Tag3>
                <Tag4>Content4</Tag4>
                <Tag5>123</Tag5>
              </Tag1>
            </Tag2>
            <Tag3>Ex</Tag3>
            <Tag4>Content3</Tag4>
            <Tag5>456</Tag5>
          </Tag1>
        </Tag2>
        <Tag3>Ex</Tag3>
        <Tag4>Content2</Tag4>
        <Tag5>789</Tag5>
      </Tag1>
    </Tag2>
    <Tag3>Ex</Tag3>
    <Tag4>Content1</Tag4>
    <Tag5>1011</Tag5>
  </Tag1>
</Tag1Group>

如何更改方法以从 tag4 中获取所有元素,而不管它们的级别如何。 所以我的意思也是:“Content2”、“Content3”、“Content4”

【问题讨论】:

    标签: c# xml tags


    【解决方案1】:

    你甚至不需要 linq。有一个方法Descendants(),它允许您获取名称作为参数传递的所有元素。

    代码中的示例:

            public List<string> Method(string sourcePath)
            {
                string directory = sourcePath;
                var resultList = new List<string>();
    
                try
                {
                    XDocument xdocument = XDocument.Load(directory);
                    var docNamespace = xdocument.Root.Name.Namespace;
                    var tags = xdocument.Descendants(docNamespace + "Tag4");
    
                    foreach (var tag in tags)
                    {
                        var value = tag?.Value;
                        if (!string.IsNullOrEmpty(value) && !resultList.Contains(value))
                        {
                            resultList.Add(value);
                        }
                    }
                }
                catch (Exception ex)
                {
                }
                return resultList;
            }
    

    【讨论】:

      【解决方案2】:

      尝试使用Descendants()方法:

      按文档顺序返回此文档或元素的后代元素的集合。

      IEnumerable<XElement> tags = xdocument.Root.Descendants()
          .Where(e => e.Name.LocalName == "Tag4")
      

      【讨论】:

      • @Max 很乐意提供帮助!
      猜你喜欢
      • 2021-07-10
      • 2014-01-18
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多