首页 > 解决方案 > 在 C# 中使用 Ling 解析 xml

问题描述

嗨,我有一个 Xml 文档,使用从文件中读取

var doc = XDocument.Load(reader);

xml看起来像这样,

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE document SYSTEM 'xmlschemas/some.dtd'>
<document xmlns='http://www.abcd.com/dxl' version='9.0' someversion='1.0' 
          replicaid='0xxxxDB' form='Test'>
   <item name='From'>
      <text>John Doe</text>
   </item>
   <item name='SentTo'>
      <text>Another John Doe</text>
   </item>
   <item name='ModTime'>
      <datetime dst='true'>20180129T114649,22-02</datetime>
   </item>
   <item name='Body' sign='true' seal='true'>
       <attachmentref name='some.pdf' displayname='some.pdf'>
           <picture height='34px' width='342px'>
                <notesbitmap>
                    lQAmAAAAAAAAAAAAAAABAAAAAAAAAFYBI
                </notesbitmap>
           </picture>

如何在定位具有特定名称属性的“项目”标签时使用 Linq 解析这样的 xml?试过这个没有成功。,

 doc.Descendants("document")
 .Where(item =>
 {
    string cus = (string)item.Element("item");
    return cus != null && cus == "name";
 })
 .Descendants("SentTo")
 .Select(d => d.Value)
 .ToList();

我想定位具有名称属性“From”和“SentTo”的项目标签,还有其他我可能不想定位的标签。提前致谢。

标签: c#xmllinq

解决方案


部分问题是您正在寻找没有命名空间的元素,但您的文档确实指定了默认命名空间。幸运的是,LINQ to XML 使命名空间处理变得容易。

您还Descendants用来尝试查找属性的值(我相信),这不是它的工作原理。

这是一个可行的示例-假设您的目标是从具有以下属性的<text>每个元素中获取内容:<item>nameSentTo

using System;
using System.Linq;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        var doc = XDocument.Load("test.xml");
        XNamespace ns = "http://www.abcd.com/dxl";
        var sentToValues = doc.Root
            .Elements(ns + "item")
            .Where(item => (string) item.Attribute("name") == "SentTo")
            .Select(item => (string) item.Element(ns + "text"))
            .ToList();
        foreach (var value in sentToValues)
        {
            Console.WriteLine(value);
        }
    }
}

推荐阅读