3 回答

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

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

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();
輸出:
所以,如果你想取多個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();
輸出:
- 3 回答
- 0 關注
- 285 瀏覽
添加回答
舉報