【问题标题】:extract attribute value and node value from parent node in XML从XML中的父节点提取属性值和节点值
【发布时间】:2019-09-02 14:17:40
【问题描述】:

我有这个 XML:

<?xml version="1.0" encoding="UTF-8"?>
<keywords>
   <keyword subject="x">a</keyword>
   <keyword subject="y">b</keyword>
</keywords>

我想从上面的 XML 示例中提取节点和属性值,如下所示:

a|x, b|y

这在 C# 中可行吗?

【问题讨论】:

  • 您可以使用XmlReader 来解析XML 并提取所需的内容。
  • 我相信我可以感谢或者我可以使用 linq to xml。但是,通常只能提取节点值或属性值。我只是不确定如何使用,例如,xmlreader 来提取这样的组合......
  • @ZulqarnainJalil 这根本不相关!

标签: c# xml xml-parsing


【解决方案1】:

您可以使用LinqToXML 来实现您的目标。像这样

XElement element = XElement.Parse(@"<?xml version=""1.0"" encoding=""UTF-8""?>
                                    <keywords>
                                         <keyword subject=""x"">a</keyword>
                                         <keyword subject=""y"">b</keyword>
                                    </keywords>");

var result = String.Join(", ", (from d in element.Descendants("keyword")
                     select $"{d.Value}|{d.Attribute("subject").Value}"));

result 字符串:a|x, b|y

此代码示例只是展示了正确的方向和概念。不要忘记实现所有必要的检查和边界情况(例如,是否需要 subject 属性?)。

希望对您有所帮助。

【讨论】:

  • @cs0815 对您有帮助吗?如果是,请标记为答案
【解决方案2】:

您可以尝试使用 XElement 来做到这一点,就像

XElement myXml = XElement.Load("xmlFile Location),

然后您可以使用 linq 查询您的数据集,并将值存储在一些列表中,您可以将其格式化为您想要的输出。

https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xelement?view=netframework-4.8 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/xelement-class-overview

您可以使用 Attributes 方法从 Element(您的特定节点)及其值中获取 XAttribute

https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xattribute?view=netframework-4.8

【讨论】:

    【解决方案3】:

    您可以使用 XDocument 进行快速数据检索(将 .Parse 替换为 .Load 作为文件路径):

    var document = XDocument.Parse(xml);
    string result = document
                    .Element("keywords")
                    .Elements("keyword")
                    .Aggregate<XElement, string>(string.Empty, (res, element)
                        => (string.IsNullOrEmpty(res) ? res : res + ", ") + element.Value + "|" + element.Attribute("subject").Value);
    

    如果 xml 规范是你的,你可能应该制作 xml 模型类并将 xml 反序列化到它们中。

    【讨论】:

      【解决方案4】:

      这是在C# Console app 中使用XmlReader 类的答案

       XmlReader reader = XmlReader.Create(@"[Location of your XML file here..]"); 
        while (reader.Read())
        {
          if (reader.NodeType == XmlNodeType.Element)
          {
            if (reader.Name.ToLower() == "keyword")
            {
              Console.WriteLine(reader.Value);
      
              if (reader.HasAttributes)
              {
                Console.WriteLine(reader.GetAttribute("subject"));
              }
            }
          }
        }
        Console.ReadKey();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-11
        • 1970-01-01
        • 1970-01-01
        • 2016-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多