linq-to-xml 相关问题

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

使用 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

C# 使用 Linq 从 Datatable 创建 XML 文件

我是 XML 的新手,想从数据表创建 XML 文档 我有一个包含以下数据的数据表: https://i.stack.imgur.com/rHTE2.png 在此处输入图像描述 在此处输入图像描述 ...

回答 0 投票 0

C# 将对象序列化为包含对象列表的 XML

我需要序列化 XML 以附加 API PUT 请求。 我正在使用 System.Xml.Serialization。 最终结果需要类似于以下内容: 我需要序列化一个 XML 以附加到 API PUT 请求。 我正在使用 System.Xml.Serialization. 最终结果需要类似于以下内容: <?xml version="1.0" encoding="UTF-8"?> <prestashop xmlns:xlink="http://www.w3.org/1999/xlink"> <product> <id> <![CDATA[2678]]> </id> <cache_default_attribute> <![CDATA[0]]> </cache_default_attribute> <id_shop_default> <![CDATA[1]]> </id_shop_default> <reference> <![CDATA[2678]]> </reference> <supplier_reference> <![CDATA[]]> </supplier_reference> <location> <![CDATA[]]> </location> <width> <![CDATA[0.000000]]> </width> <height> <![CDATA[0.000000]]> </height> <depth> <![CDATA[0.000000]]> </depth> <weight> <![CDATA[0.000000]]> </weight> <quantity_discount> <![CDATA[0]]> </quantity_discount> <ean13> <![CDATA[]]> </ean13> <isbn> <![CDATA[]]> </isbn> <upc> <![CDATA[0]]> </upc> <mpn> <![CDATA[000.018]]> </mpn> <cache_is_pack> <![CDATA[0]]> </cache_is_pack> <cache_has_attachments> <![CDATA[0]]> </cache_has_attachments> <is_virtual> <![CDATA[0]]> </is_virtual> <state> <![CDATA[1]]> </state> <additional_delivery_times> <![CDATA[1]]> </additional_delivery_times> <delivery_in_stock> <language id="1"> <![CDATA[]]> </language> <language id="2"> <![CDATA[]]> </language> </delivery_in_stock> <delivery_out_stock> <language id="1"> <![CDATA[]]> </language> <language id="2"> <![CDATA[]]> </language> </delivery_out_stock> <product_type> <![CDATA[combinations]]> </product_type> <on_sale> <![CDATA[0]]> </on_sale> <online_only> <![CDATA[0]]> </online_only> <date_add> <![CDATA[2023-02-16 00:21:12]]> </date_add> <date_upd> <![CDATA[2023-02-22 17:22:23]]> </date_upd> <name> <language id="1"> <![CDATA[ETNIES TRI LAM POLO (000.018)]]> </language> <language id="2"> <![CDATA[ETNIES TRI LAM POLO (000.018)]]> </language> </name> </product> </prestashop> 为此,我有一个这样的课程: [XmlType("product")] public class Product { public Product() { id = ""; active = "1"; available_for_order= "1"; indexed= "1"; visibility = "both"; delivery_in_stock = new List<PaLanguage>(); delivery_out_stock = new List<PaLanguage>(); name = new List<PaLanguage>(); } [XmlElement("id")] public XmlCDataSection C_id { get { return new XmlDocument().CreateCDataSection(id); } set { id = value.Value; } } [XmlIgnore] public string id; [XmlElement("cache_default_attribute")] public XmlCDataSection C_cache_default_attribute { get { return new XmlDocument().CreateCDataSection(cache_default_attribute); } set {cache_default_attribute = value.Value; } } [XmlIgnore] public string cache_default_attribute; ... [XmlArray("delivery_in_stock")] public List<PaLanguage> delivery_in_stock; [XmlArray("delivery_out_stock")] public List<PaLanguage> delivery_out_stock; ... PaLanguage 是: public class PaLanguage { [XmlElement("language")] public XmlCDataSection C_language { get { return new XmlDocument().CreateCDataSection(language); } set { language = value.Value; } } [XmlIgnore] public string language { get; set; } [XmlAttribute("id")] public string id; } 因为这是更新记录,所以我首先完成一个获取请求,然后匹配它的所有值。 我使用以下代码完成此操作: XDocument getResponse = Helper.GetProductReference(get, Helper.GetValueByKey("ShopApi") + "products/"); var gotProduct = getResponse .Element("prestashop") .Element("products") .Elements("product") .Where(e => e.Element("reference").Value == mtrl) .Single(); 我创建了一个新的产品项附加到我的放置请求,但我在序列化它的 XmlArrays 时遇到了问题。 我尝试的最后一件事是: foreach (XElement x in gotProduct.Element("delivery_in_stock").Elements("language")) { product.delivery_in_stock.Add(new PrestaLanguage { id = (string)x.Attribute("id"), language = (string)x.Element("language") }); } 这是完全错误的,因为它将它序列化为: <product> <id><![CDATA[2678]]></id> ... xml <delivery_in_stock> <PaLanguage id="1"> <language><![CDATA[]]></language> </PaLanguage> <PaLanguage id="2"> <language><![CDATA[]]></language> </PaLanguage> </delivery_in_stock> 感觉就像我已经尝试了所有可以在网上和官方文档中找到的东西,每次尝试都离我的预期结果更远。 我应该注意到这个类实际上还有几十个字段,它们要么只是一个字符串,要么是 id 和语言值的另一种组合。 感谢任何帮助。 似乎 XML 中的 delivery_in_stock 和 delivery_out_stock 元素可以包含具有不同 id 属性的多个语言元素。因此,您需要修改您的 foreach 循环以处理多种语言元素。 您可以使用 Descendants("language") 而不是使用 Elements("language") 来获取 delivery_in_stock 和 delivery_out_stock 下的所有语言元素。 foreach (XElement x in gotProduct.Element("delivery_in_stock").Descendants("language")) { product.delivery_in_stock.Add(new PaLanguage { id = (string)x.Attribute("id"), language = (string)x }); } foreach (XElement x in gotProduct.Element("delivery_out_stock").Descendants("language")) { product.delivery_out_stock.Add(new PaLanguage { id = (string)x.Attribute("id"), language = (string)x }); } 此外,在 PaLanguage 类中,语言属性应该是 XmlCDataSection 类型,而不是字符串,因为它包含 CDATA。 public class PaLanguage { [XmlText] public XmlCDataSection language { get; set; } [XmlAttribute("id")] public string id { get; set; } } 最后是product类,应该给没有的properties加上[XmlElement]属性,比如id_shop_default, reference, supplier_reference等 [XmlType("product")] public class Product { public Product() { id = ""; active = "1"; available_for_order = "1"; indexed = "1"; visibility = "both"; delivery_in_stock = new List<PaLanguage>(); delivery_out_stock = new List<PaLanguage>(); name = new List<PaLanguage>(); } [XmlElement("id")] public XmlCDataSection C_id { get { return new XmlDocument().CreateCDataSection(id); } set { id = value.Value; } } [XmlElement("cache_default_attribute")] public XmlCDataSection C_cache_default_attribute { get { return new XmlDocument().CreateCDataSection(cache_default_attribute); } set { cache_default_attribute = value.Value; } } [XmlElement("id_shop_default")] public XmlCDataSection C_id_shop_default { get { return new XmlDocument().CreateCDataSection(id_shop_default); } set { id_shop_default = value.Value; } } [XmlElement("reference")] public XmlCDataSection C_reference { get { return new XmlDocument().CreateCDataSection(reference); } set { reference = value.Value; } } [XmlElement("supplier_reference")] public XmlCDataSection C_supplier_reference { get { return new XmlDocument().CreateCDataSection(supplier_reference); } set { supplier_reference = value.Value; } } [XmlElement("location")] public XmlCDataSection C_location { get { return new XmlDocument().CreateCDataSection(location); } set { location = value.Value; } } [XmlElement("width")] public XmlCDataSection C_width { get { return new XmlDocument().CreateCDataSection(width); } set { width = value.Value; } } [XmlElement("height")] public XmlCDataSection C_height { get { return new XmlDocument().CreateCDataSection(height); } set { height = value.Value; } } // etc..

回答 1 投票 0

System.Xml.Linq.XContainer.Element(...) 返回 null

我有 postXmlData 方法来发布请求并在 Xml 中获得响应。收到回复后,我试图显示属性名称以(“f”)开头,但出现错误 System.Xml.Linq.XContai ...

回答 1 投票 0

XElement - 无法捕获下一个节点。

我有一个下面的xml文件。 1100 ...

回答 1 投票 0

使用Linq C#使用where条件读取一个XML。

我试图为我的业务做一个小服务,但它不工作。 12323 1232 ASDF III

回答 1 投票 0

Linq to XML - 读取多个属性的值。

我试图读取一个XML文件来连接特定属性的值。我有一个元素,它有一堆属性,如下图所示。

回答 1 投票 0

XDocument.parse将字符串作为一个元素进行解析。

当我使用XDocument.parse时,它将整个字符串解析为一个元素,解析后的文档没有任何结构,我正在使用regex来查找我需要工作的XML字符串,这是我的代码int total=1; ....

回答 1 投票 0

数据未保存在xml文件中

在ASP.NET MVC中,我有这样的代码:我想把datareader中的数据保存在xml文件中,我使用了下面的代码,但我在文件中只有两行。 &...

回答 1 投票 0

LINQXML - 循环查询结果(返回的元素比预期的低)

我试图循环浏览一个LINQXML查询的结果。当我使用.Element(1).Value时,我可以返回一个字符串结果,但现在我想返回所有的Elements()并循环浏览它们。我显示...

回答 1 投票 0

XMLReader正在跳过元素

我有以下XML文件(带有伪数据) ] [ ] >>

回答 1 投票 0

使用LINQ方法语法将XML数据放入Dictionary对象中

我想将XML文档解析为Dictionary对象。结构如下.. [[[[[12345 科罗拉多&...

回答 1 投票 0

LINQ to XML复杂查询过滤

我有基于Microsoft文档的代码。 https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/linq/how-to-write-queries-with-complex-filtering字符串xml =“ ” ...] >

回答 1 投票 0

为什么FirstNode.GetType()返回XElement而不是XNode

c#文档说FirstNode属性返回一个XNode。公共System.Xml.Linq.XNode FirstNode {get; }但是,当我在其上调用GetType()方法时,它表示System.Xml.Linq.XElement为...

回答 2 投票 1

使用Linq到XML查询google sitemap.xml的问题

我有一个Linq-2-XML查询,如果我创建的Google站点地图的urlset元素中填充了属性,则该查询将不起作用,但如果不存在属性,该查询将正常运行。无法...

回答 1 投票 3

LINQ to XML-尝试通过元素的属性值选择元素列表

我正在尝试从XML文档中获取元素列表,其中节点具有特定的属性值。该文档的结构如下: ...

回答 3 投票 2

定义元素离XML根的距离

考虑XML: Cake 0.55 ]] 您应该能够使用Parent属性,计算步骤,直到到达根目录为止: public int GetElmtDepth(XDocument doc, XElement elmt) { var (depth, target) = (0, elmt); while (target != doc.Root) (depth, target) = (depth + 1, target.Parent); return depth; } 您可以从System.Xml.XmlTextReader.Depth简化MSDN示例以显示节点元素及其各自的深度: // XML file to be parsed. string xmlFilePath = @"C:\test.xml"; // Create the reader. using XmlTextReader reader = new XmlTextReader(xmlFilePath); // Parse the XML and display each node. while (reader.Read()) { // If node type is an element // Display element name and depth if (reader.NodeType == XmlNodeType.Element) { Console.WriteLine($"Element = {reader.Name}, Depth = {reader.Depth}"); } } 输出: Element = items, Depth = 0 Element = item, Depth = 1 Element = name, Depth = 2 Element = ppu, Depth = 2 Element = batters, Depth = 2 Element = batter, Depth = 3 Element = batter, Depth = 3 Element = batter, Depth = 3 Element = topping, Depth = 2 Element = topping, Depth = 2 Element = topping, Depth = 2 Element = topping, Depth = 2 Element = topping, Depth = 2 Element = topping, Depth = 2 未来的读者可能希望看到用于计算元素深度的纯XPath解决方案: [使用任何方法选择目标元素,例如,id://*[@id="1001"]。 选择所有祖先://*[@id="1001"]/ancestor::* 计算那些祖先:count(//*[@id="1001"]/ancestor::*)。 按预期,这将为给定的XML返回3。

回答 3 投票 0

如何将XML子节点添加到父节点c#

如何将XML子节点添加到父节点c#,我当前的xml文件如下所示: [45 ...

回答 1 投票 1

如何从嵌套属性获取值?

[[[[[[[[[[[[[>] 您应该考虑按顺序查询XML report =>location => day ==> hour。尝试一下:

回答 1 投票 0

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