gpt4 book ai didi

c# - 在 C# 中使用 Ling 解析 xml

转载 作者:太空宇宙 更新时间:2023-11-03 18:21:25 26 4
gpt4 key购买 nike

您好,我有一个 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”的项目标签,还有其他我可能不想定位的标签。提前致谢。

最佳答案

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

您还使用了 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);
}
}
}

关于c# - 在 C# 中使用 Ling 解析 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52113341/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com