亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 C# 中使用 Ling 解析 xml

在 C# 中使用 Ling 解析 xml

C#
冉冉說 2021-12-25 16:38:43
我有一個 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”的項目標簽,還有其他我可能不想定位的標簽。提前致謝。
查看完整描述

3 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

部分問題在于您正在尋找沒有名稱空間的元素,但您的文檔確實指定了默認名稱空間。幸運的是,LINQ to XML 使命名空間處理變得容易。


您還Descendants試圖找到一個屬性的值(我相信),這不是它的工作原理。


下面是一個例子做的工作-假設你的目標是讓<text>每個內容<item>與元素name的屬性SentTo:


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);

        }

    }

}


查看完整回答
反對 回復 2021-12-25
?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

您不想使用 HtmlAgilityPack 進行 XML 解析。但是,如果您明白這可能是一個問題的原因,但仍然接受此決定,那么您可以執行以下操作:


var relevantItems = doc.DocumentNode

    .Descendants("item")

    .Select(x => new

    {

        Item = x,

        ItemName = x.Attributes.Contains("name") ? x.Attributes["name"].Value : null

    })

    .Where(x => x.ItemName == "From" || x.ItemName == "SentTo")

    .Select(x => x.Item)

    .ToList();


查看完整回答
反對 回復 2021-12-25
?
烙印99

TA貢獻1829條經驗 獲得超13個贊

您的 xml 包含namespace. 所以你也必須在你的代碼中讀取那個命名空間


XDocument doc = XDocument.Load(@"XMLFile1.xml");

XNamespace ns = doc.Root.GetDefaultNamespace();


var text = doc.Descendants(ns + "item")

              .Single(c => c.Attribute("name").Value == "SentTo")

              .Elements(ns + "text")

              .Select(item => (string)item)

              .FirstOrDefault();

輸出:

http://img1.sycdn.imooc.com//61c6d8bd0001c1e204150154.jpg

所以,如果你想取多個name屬性text節點,那么


//This is sample string of array

string[] strArray = new string[2] { "From", "SentTo" };


var list = doc.Descendants(ns + "item")

              .Where(c => strArray == null || strArray.Any(x => x.Contains(c.Attribute("name").Value)))

              .Elements(ns + "text")

              .Select(item => (string)item)

              .ToList();

輸出:

http://img1.sycdn.imooc.com//61c6d8ca0001f48407010151.jpg

查看完整回答
反對 回復 2021-12-25
  • 3 回答
  • 0 關注
  • 285 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號