linq-to-xml 相关问题

LINQ-to-XML提供类似SQL的查询体验,用于导航,解析和聚合存储在XML文档中的数据。

与 LINQ to XML 联合

我需要将两组 XElement 合并为一组唯一的元素。使用 .Union() 扩展方法,我只得到一个“union all”而不是联合。我错过了什么吗? 变种

回答 4 投票 0

获取 XElement 在原始文档中的位置和长度

我正在解析特定节点的 XML 文档,并希望稍后在 ui 中显示 xml 文档,突出显示特定部分。为此,我需要知道元素的位置...

回答 2 投票 0

XElement - 查找具有两个不同子值的节点

使用下面的列表: 亚洲 香港标准时间 乔 使用下面的列表: <People> <Continent>Asia</Continent> <TimeZone>Hong Kong Standard Time</TimeZone> <Person> <FirstName>Joe</FirstName> <LastName>Stevenson</LastName> </Person> <Person> <FirstName>Joe</FirstName> <LastName>Hancock</LastName> </Person> <Person> <FirstName>Kirby</FirstName> <LastName>Stevenson</LastName> </Person> </People> 我想使用一些 XElement LINQ 来选择包含 Joe Stevenson 的名字和姓氏的节点。我在这里尝试了以下代码: string trimmedFirstName = "Joe"; string trimmedLastName = "Stevenson"; List<XElement> peopleChildren = convertedPayload.Descendants("Person").Where(a => a.Value.Contains(trimmedFirstName) && a.Value.Contains(trimmedLastName)).ToList(); 但是当我使用上面的代码时,我相信我什么也没有返回,因为我试图检查单个值。我想按值进行选择,与 XElement 名称无关(因此我应该能够检查,例如,某人的姓氏为“Joe”,名字为“Stevenson”,以便我可以将其更正为实际的我的原始数据的名字和姓氏)。 当我在上面的 LINQ 中使用 OR 运算符时,当然我返回了太多元素。 这里有人可以给建议吗? 您可以使用 Element 方法来缩小元素名称范围。以下应该有效。 string trimmedFirstName = "Joe"; string trimmedLastName = "Stevenson"; List<XElement> peopleChildren = convertedPayload.Descendants("Person") .Where(a => a.Element("FirstName").Value.Contains(trimmedFirstName) && a.Element("LastName").Value.Contains(trimmedLastName)).ToList();

回答 1 投票 0

XML 反序列化错误 - CLR/System.InvalidOperationException

我尝试将 XML 文件反序列化为对象,但我不断收到相同的错误(如下所述)。我相信我已经正确映射了反对意见。我一直在使用本指南和视频作为

回答 1 投票 0

尝试使用 XML to LINQ 以正确的排序顺序将新元素添加到 XML 中

我正在尝试向 XML 文件添加一些条目: foreach(var talkNumber in listNumbers) { var newElem = new XElement("PublicTalk", 新的 XAttribute...

回答 1 投票 0

用 href 链接替换 SVG 内部文本值

我正在使用 SVG 文件,这与 XML 相同。 我需要用 href 新元素及其 InnerText 替换某些元素的 InnerText 我的元素的一个例子是 我正在使用 SVG 文件,这与 XML 相同。 我需要用 href 新元素及其 InnerText 替换某些元素的 InnerText 我的元素的一个例子是 <text xmlns="http://www.w3.org/2000/svg" xml:space="preserve" fill="#ff0000" stroke-width="0" x="239.61" y="74.89" font-size="3.37" opacity="1.00" font-family="Arial Narrow">3070119100</text> 我需要将 3070119100 InnerText 替换为 <a link:href="http://www.google.it">3070119100</a> 我想我需要添加一个子项,其 InnerText 为先前的值。 我想使用 LINQ XDocument,但也很欣赏使用 XMLDocument 编写代码。 我能做什么: 我能够使用 XMLDocument 添加子元素,但不能清除 insideText 文本元素: XmlDocument doc = new XmlDocument(); doc.Load(_SVG); XmlNodeList elementListText = doc.GetElementsByTagName("text"); for (int i = 0; i < elementListText.Count; i++) { XmlElement a = doc.CreateElement("a"); a.SetAttribute("xmlns", "http://www.w3.org/2000/svg"); a.SetAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); a.SetAttribute("xlink:href", "http://www.google.it"); a.InnerText = elementListText[i].InnerText; elementListText[i].AppendChild(a); } doc.Save(_SVG_TEXT); 通过这种方式,我获得了两次值,一次未链接(上一个),一次链接(href 值),但我无法清除文本 InnerText。 谢谢! 以下使用 Xml Linq using System; using System.Collections.Generic; using System.Linq; using System.Xml; using System.Xml.Linq; namespace ConsoleApp10 { class Program { static void Main(string[] args) { string _SVG = @"<text xmlns=""http://www.w3.org/2000/svg"" xmlns:xlink=""http://www.w3.org/2000/svg"" xml:space=""preserve"" fill=""#ff0000"" stroke-width=""0"" x=""239.61"" y=""74.89"" font-size=""3.37"" opacity=""1.00"" font-family=""Arial Narrow"">3070119100</text>"; XDocument doc = XDocument.Parse(_SVG); //to read from file //XDocument doc = XDocument.Load(filename); XNamespace ns = doc.Root.GetDefaultNamespace(); XNamespace xlink = doc.Root.GetNamespaceOfPrefix("xlink"); List<XElement> elementListText = doc.Descendants(ns + "text").ToList(); foreach(XElement element in elementListText) { string value = element.Value; element.RemoveNodes(); XElement a = new XElement(ns + "a"); a.SetAttributeValue(ns + "xlink", "http://www.w3.org/1999/xlink"); a.SetAttributeValue(xlink + "href", "http://www.google.it"); a.SetValue(value); } //doc.Save(filename); } } }

回答 1 投票 0

这个代码片段可以移到其他代码块中吗?

给出以下代码: 公共 WeekendMeetingHistoryItem[] ExtractFutureWeekendMeetingHistoryItems(DateTime datWeekOfMeeting, String strHistoryDatabase) { 列表

回答 1 投票 0

它在 Alexa XML 文件中有 2 个元素 <COUNTRY>

像往常一样,我使用下面的代码来获取 Alexa 越南排名,越南排名位于元素中: 只有一个元素 像往常一样,我使用下面的代码来获取 Alexa 越南排名,越南排名位于元素中: <COUNTRY CODE="VN" NAME="Vietnam" RANK="20"/> 这里只有一个元素<COUNTRY>。 private int GetAlexaRank(string domain) { var alexaRank = 0; try { var url = string.Format("http://data.alexa.com/data?cli=10&dat=snbamz&url={0}", domain); var doc = XDocument.Load(url); var vnrank = doc.Descendants("COUNTRY").Select(node => node.Attribute("RANK").Value).FirstOrDefault();// Vietnam Rank if (!int.TryParse(vnrank, out alexaRank)) alexaRank = -1; } catch (Exception e) { return -1; } return alexaRank; } 但在这种情况下,它有两个要素: 越南排名在第二个元素,我怎样才能得到它? alexaRank = doc.Descendants("COUNTRY") .Select(c => (int?)c.Attribute("RANK")) .Where(r => r.HasValue) .FirstOrDefault() ?? -1; 它是如何工作的:所有 COUNTRY 后代都是从 xml 响应中选择的(无论这些元素位于 xml 中的哪个位置)。然后,从每个国家/地区元素中,我们选择属性 RANK 并将该属性转换为可空整数。如果国家/地区没有排名属性或该属性的值,则给出 null。然后我们从排名属性值中选择第一个或默认值。如果什么也没找到,那么它会给我们一个null。使用空合并运算符 ??,我们分配 -1 而不是 null。如果找到某些内容,则可空整数的值将分配给alexaRank。 因此,如果未找到国家/地区节点,或者没有具有排名属性的国家/地区节点(好吧,仅当排名不是整数时),您将不会在这里遇到解析异常。但您仍然可能会遇到其他异常,例如网络不可用时出现错误。所以,你可以把try catch留在这里。但不要吞下异常!你应该记录它。 您也可以使用 XPath: private int GetAlexaRank(string domain) { try { var doc = XDocument.Load(url); var country = xdoc.XPathSelectElement("//COUNTRY[@RANK]"); if (country == null) return 0; return (int)country.Attribute("RANK"); } catch (Exception e) { // Log exception here! return -1; } }

回答 1 投票 0

C# Linq to XML 获取父对象和子对象

我正在尝试读取 XML 文件,然后将值填充到 C# 类(父对象和子对象)中。为了简洁起见,我省略了很多代码。我正在尝试通过 Linq 来完成此任务...

回答 1 投票 0

从 XElement 中删除属性

请考虑这个 XElement: 1 ...

回答 4 投票 0

使用 Linq to XML 在正确位置添加新条目(基于数字属性)

我想出了这个函数来保存或更新 XML 文件中的条目。 公共无效 SetOutlineInfo(字符串 talkdatabase,int talknumber,字符串 languageCode,bool talkExcluded,DateTime

回答 1 投票 0

如何在 Xml Linq 上创建子项

在northwind数据库中。我使用订单和orderDetails表。我想创建一个xml文件,其中订单显示在XML上的项目标签上,订单详细信息显示在子项目上。假设orderid=1显示在项目标签上,然后

回答 2 投票 0

使用 LINQ 生成 XML 时从元素中删除 xmlns 属性?

我在生成 sitemap.xml 时遇到问题 我的创建者代码是这样的: XNamespace xmlns = XNamespace.Get("http://www.sitemaps.org/schemas/sitemap/0.9"); XNamespace xsi = XNamespace.Get("http...

回答 3 投票 0

回答 2 投票 0

如何将 XPath 与 XElement 或 LINQ 结合使用?

考虑以下 XML: 200 好的 http://bit.ly/b47LVi ...

回答 6 投票 0

我可以使用 LINQ to XML 从此 XML 文件中提取所需的日期信息吗?

这可以通过 LINQ to XML 实现吗? 我有一个 List 对象,并且获得了最后邀请日期早于今天的所有项目的列表: var congs =_CongregationData.

回答 1 投票 0

XDocument.Descendants 无法区分父/子元素

我有这样的 XML: 我有这样的 XML: <?xml version="1.0" encoding="utf-8"?> <Document> <Interface> <Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v4"> <Section Name="Static"> <Member Name="3bool1" Datatype="&quot;3bool&quot;" Remanence="NonRetain" Accessibility="Public"> <AttributeList> <BooleanAttribute Name="ExternalAccessible" SystemDefined="true">true</BooleanAttribute> <BooleanAttribute Name="ExternalVisible" SystemDefined="true">true</BooleanAttribute> <BooleanAttribute Name="ExternalWritable" SystemDefined="true">true</BooleanAttribute> <BooleanAttribute Name="SetPoint" SystemDefined="true">false</BooleanAttribute> </AttributeList> <Sections> <Section Name="None"> <Member Name="bool1" Datatype="Bool" /> <Member Name="bool2" Datatype="Bool" /> <Member Name="bool3" Datatype="Bool" /> </Section> </Sections> </Member> <Member Name="int7" Datatype="Int" Remanence="NonRetain" Accessibility="Public"> <AttributeList> <BooleanAttribute Name="ExternalAccessible" SystemDefined="true">true</BooleanAttribute> <BooleanAttribute Name="ExternalVisible" SystemDefined="true">true</BooleanAttribute> <BooleanAttribute Name="ExternalWritable" SystemDefined="true">true</BooleanAttribute> <BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute> </AttributeList> </Member> </Section> </Sections> </Interface> </Document> 使用以下代码,我可以获取布尔“数据类型”的所有后代“成员”元素: XNamespace ns = "http://www.siemens.com/automation/Openness/SW/Interface/v4"; var memb = doc.Descendants(ns + "Member") .Select(f => f.Attribute("Datatype")) .Where(n => n.Value.Contains("Bool")) .ToList(); memb.ForEach(i => Console.WriteLine("{0}\t", i)); 我想做的是: 搜索某些“成员”元素是否具有某些“成员”子元素(组合数据类型); 提取该特定父元素的所有子元素(在本例中为 bool1、bool2、bool3) 您有一个具有递归模式的 XDocument,其中 <Member> 后代包含嵌套的 <Member> 后代。您想要遍历文档,返回顶级 <Member> 元素及其最顶层 <Member> 后代,然后从这些后代中提取一些数据。目前您正在使用 XDocument.Descendants() 遍历文档,这不能很好地方便地捕获父母和孩子的分组。 一种方法是使用方法XElementExtensions.DescendantsUntil(this XElement root, Func<XElement, bool> predicate, bool includeSelf)从this answer到How to find highest level descendants with a given name to find the topmost <Member> elements, then for each of those,再次使用DescendantsUntil()找到他们最顶层的<Member>后代。 首先定义DescendantsUntil()如下: public static partial class XElementExtensions { /// <summary> /// Enumerates through all descendants of the given element, returning the topmost elements that match the given predicate /// </summary> /// <param name="root"></param> /// <param name="filter"></param> /// <returns></returns> public static IEnumerable<XElement> DescendantsUntil(this XElement? root, Func<XElement, bool> predicate) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return GetDescendantsUntil(root, predicate, false); } static IEnumerable<XElement> GetDescendantsUntil(XElement? root, Func<XElement, bool> predicate, bool includeSelf) { if (root == null) yield break; if (includeSelf && predicate(root)) { yield return root; yield break; } var current = root.FirstChild<XElement>(); while (current != null) { var isMatch = predicate(current); if (isMatch) yield return current; // If not a match, get the first child of the current element. var next = (isMatch ? null : current.FirstChild<XElement>()); if (next == null) // If no first child, get the next sibling of the current element. next = current.NextSibling<XElement>(); // If no more siblings, crawl up the list of parents until hitting the root, getting the next sibling of the lowest parent that has more siblings. if (next == null) { for (var parent = current.Parent as XElement; parent != null && parent != root && next == null; parent = parent.Parent as XElement) { next = parent.NextSibling<XElement>(); } } current = next; } } public static TNode? FirstChild<TNode>(this XNode node) where TNode : XNode => node switch { XContainer container => container.FirstNode?.NextSibling<TNode>(true), _ => null, }; public static TNode? NextSibling<TNode>(this XNode node) where TNode : XNode => node.NextSibling<TNode>(false); public static TNode? NextSibling<TNode>(this XNode node, bool includeSelf) where TNode : XNode { for (var current = (includeSelf ? node : node.NextNode); current != null; current = current.NextNode) { var nextTNode = current as TNode; if (nextTNode != null) return nextTNode; } return null; } //Taken from this answer https://stackoverflow.com/a/46016931/3744182 //To https://stackoverflow.com/questions/46007738/how-to-find-first-descendant-level //With added nullability annotations and updated syntax } 现在你可以做: XNamespace ns = "http://www.siemens.com/automation/Openness/SW/Interface/v4"; XName name = ns + "Member"; var members = doc .Root.DescendantsUntil(e => e.Name == name) .Select(e => (Parent: e, Children : e.DescendantsUntil(c => c.Name == name).ToList())) //.Where(i => i.Children.Count > 0) // Uncomment to filter out <Member> elements with no child members. .ToList(); members.ForEach(i => Console.WriteLine("Parent: \"{0}\", Children: {1}", i.Parent.Attribute("Name")?.Value, i.Children.Count == 0 ? "None" : string.Join(",", i.Children.Select(c => $"\"{c.Attribute("Name")?.Value}\"")))); 哪个打印 Parent: "3bool1", Children: "bool1","bool2","bool3" Parent: "int7", Children: None 如果您对没有<Member Name="int7"子元素的<Member>元素不感兴趣,您可以通过取消注释上面的Where()子句来过滤掉这些元素: .Where(i => i.Children.Count > 0) // Uncomment to filter out <Member> elements with no child members. 演示小提琴这里. 您可以修改您的代码以实现此目的,如下所示: 添加条件过滤具有子元素的“Member”元素: var memb = doc.Descendants(ns + "Member") .Where(m => m.Attribute("Datatype").Value.Contains("Bool") && m.Descendants(ns + "Member").Any()) .ToList(); 遍历选中的成员并提取子元素: foreach (var member in memb) { var children = member.Descendants(ns + "Member") .Select(m => m.Attribute("Name").Value) .ToList(); Console.WriteLine("{0}:\t{1}", member.Attribute("Name").Value, string.Join(", ", children)); } 输出将是: 3bool1: bool1, bool2, bool3

回答 2 投票 0

如何用C#替换xml里面的xmlns

我尝试用 version 替换 xmlns 版本(任何版本) http://schemas.telerik.com/reporting/2012/3.6。在 C# 项目中 这是我得到的输入。 我试图用 version 替换 xmlns 版本(任何版本) http://schemas.telerik.com/reporting/2012/3.6。在 C# 项目中 这是我得到的输入。 <?xml version="1.0" encoding="UTF-8"?> <Report xmlns="http://schemas.telerik.com/reporting/2012/4.0" SnapGridSize="0.1cm" ShowSnapGrid="True" Name="NoviUgovor" Width="18.462cm"> </Report> 输入xmlns版本的Telerik报告是可变的。 这就是我想要得到的: <?xml version="1.0" encoding="UTF-8"?> <Report xmlns="http://schemas.telerik.com/reporting/2012/3.6" SnapGridSize="0.1cm" ShowSnapGrid="True" Name="NoviUgovor" Width="18.462cm"> </Report> 输出 xmlns 版本的 Telerik 报告必须是 http://schemas.telerik.com/reporting/2012/3.6 这是项目里面的代码: var doc = XDocument.Parse(rpt_dok);//rpt_dok (xml) doc.Root.Attributes().Where(x => x.IsNamespaceDeclaration).Remove(); doc.Root.Add(new XAttribute("xmlns", "http://schemas.telerik.com/reporting/2012/3.6")); rpt_dok = doc.ToString(); //error appears 我得到错误: 附加信息:不能将前缀“”从“http://schemas.telerik.com/reporting/2012/4.0”重新定义为“http://schemas.telerik.com/reporting/2012/3.6”开始元素标签。 我试过https://dotnetfiddle.net/qFuwWk但没有运气。 请帮忙! 您不必删除当前属性,它会被 SetAttributeValue 覆盖。 doc.Root.SetAttributeValue("xmlns", "http://schemas.telerik.com/reporting/2012/3.6""); 我觉得最简单的方法就是固定一个xml的文本 rpt_dok = rpt_dok.Replace("http://schemas.telerik.com/reporting/2012/4.0", "http://schemas.telerik.com/reporting/2012/3.6");

回答 2 投票 0

使用 XElement 解析 xml

我有这个 XElement : http://gdata.youtube.com/feeds/api/videos/s1tAYmMjLdY 2009 年 6 月 17 日星期三 05:23:10 +0000 我有这个XElement: <item> <guid isPermaLink="false">http://gdata.youtube.com/feeds/api/videos/s1tAYmMjLdY</guid> <pubDate>Wed, 17 Jun 2009 05:23:10 +0000</pubDate> <atom:updated xmlns:atom="http://www.w3.org/2005/Atom">2013-01-29T11:28:32.000Z</atom:updated> <app:control xmlns:app="http://purl.org/atom/app#"> <yt:state name="restricted" reasonCode="limitedSyndication" xmlns:yt="http://gdata.youtube.com/schemas/2007">Syndication of this video was restricted.</yt:state> </app:control> <category domain="http://schemas.google.com/g/2005#kind">http://gdata.youtube.com/schemas/2007#video</category> <category domain="http://gdata.youtube.com/schemas/2007/categories.cat">Music</category> <title>blink-182 - I Miss You</title> <description>Music video by blink-182 performing I Miss You. (C) 2003 Geffen Records</description> <link>http://www.youtube.com/watch?v=s1tAYmMjLdY&amp;feature=youtube_gdata</link> <author>blink182VEVO</author> <gd:comments xmlns:gd="http://schemas.google.com/g/2005"> <gd:feedLink rel="http://gdata.youtube.com/schemas/2007#comments" href="http://gdata.youtube.com/feeds/api/videos/s1tAYmMjLdY/comments" countHint="46136" /> </gd:comments> <media:group xmlns:media="http://search.yahoo.com/mrss/"> <media:category label="Music" scheme="http://gdata.youtube.com/schemas/2007/categories.cat">Music</media:category> <media:content url="http://www.youtube.com/v/s1tAYmMjLdY?version=3&amp;f=videos&amp;app=youtube_gdata" type="application/x-shockwave-flash" medium="video" isDefault="true" expression="full" duration="230" yt:format="5" xmlns:yt="http://gdata.youtube.com/schemas/2007" /> <media:description type="plain">Music video by blink-182 performing I Miss You. (C) 2003 Geffen Records</media:description> <media:keywords /> <media:player url="http://www.youtube.com/watch?v=s1tAYmMjLdY&amp;feature=youtube_gdata_player" /> <media:restriction type="country" relationship="deny">DE</media:restriction> <media:thumbnail url="http://i.ytimg.com/vi/s1tAYmMjLdY/0.jpg" height="360" width="480" time="00:01:55" /> <media:thumbnail url="http://i.ytimg.com/vi/s1tAYmMjLdY/1.jpg" height="90" width="120" time="00:00:57.500" /> <media:thumbnail url="http://i.ytimg.com/vi/s1tAYmMjLdY/2.jpg" height="90" width="120" time="00:01:55" /> <media:thumbnail url="http://i.ytimg.com/vi/s1tAYmMjLdY/3.jpg" height="90" width="120" time="00:02:52.500" /> <media:title type="plain">blink-182 - I Miss You</media:title> <yt:duration seconds="230" xmlns:yt="http://gdata.youtube.com/schemas/2007" /> </media:group> <gd:rating average="4.93231" max="5" min="1" numRaters="154927" rel="http://schemas.google.com/g/2005#overall" xmlns:gd="http://schemas.google.com/g/2005" /> <yt:statistics favoriteCount="0" viewCount="47338118" xmlns:yt="http://gdata.youtube.com/schemas/2007" /> </item> 我想得到media:group: XElement mediaGroup = element.Element("media:group"); 但是我得到这个错误: The ':' character, hexadecimal value 0x3A, cannot be included in a name. 我该如何解决? 您需要单独指定命名空间——您不能直接从字符串转换为非本地XName。 LINQ to XML 使用从 string 到 XNamespace 的隐式转换,然后使用重载的 + 运算符从 XName 创建 XNamespace + string 使这变得容易。 例如: XNamespace media = "http://search.yahoo.com/mrss/"; XElement mediaGroup = element.Element(media + "group"); (您可以按照 Cédric 的回答使用 XName.Get,但由于您可能会在多个位置使用相同的命名空间,所以我更喜欢这样拆分。) : 将元素名称拆分为前缀(命名空间的前缀,此处为:http://search.yahoo.com/mrss/)和本地名称。 使用:XName.Get("group", "http://search.yahoo.com/mrss/")代替。 string mediaNamespace = "http://search.yahoo.com/mrss/"; XElement mediaGroup = element.Element(XName.Get("group", mediaNamespace)); 在这里,只需将命名空间添加到 xml 文档并将变量添加到您的元素 XNamespace rss = "http://www.w3.org/2005/Atom"; XDocument feedXml = new( new XElement("rss", new XAttribute(XNamespace.Xmlns + "atom", rss), new XAttribute("Version", "2.0") )); 这将是输出: <rss xmlns:atom="http://www.w3.org/2005/Atom" Version="2.0"> <channel> <atom:link href="http://localhost:25291/news-and-articles?rss=Regulatory-Focus" rel="self" type="application/rss+xml"/>

回答 3 投票 0

c#当元素之前为空时不要作为新的 XElement

我正在尝试从代码生成 XML: //// 按部门对行进行分组(您的问题中的所有 123A)。 var departments = dt.AsEnumerable().GroupBy(r => r.Field("ID&

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.