linq-to-xml 相关问题

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

XDocument - 将打开和关闭标签转换为自关闭标签

注意:这不是语义问题。这并不是询问自闭合标签的含义。这是关于使用 XDocument 执行与本示例文章中使用 C# 提到的相反的操作: 一个 重新...

回答 1 投票 0

如何在 C# 中从 XDocument 创建缩进的 XML 字符串?

我有一个 XDocument 对象,ToString() 方法返回没有任何缩进的 XML。如何从中创建包含缩进 XML 的字符串? 编辑:我问如何创建一个内存存储...

回答 4 投票 0

XElement 和 UTF-8 问题

我有一个 .NET Web 服务(.asmx,而不是 .svc),它通过 HTTP POST 接受字符串。它接受的字符串是 xml 信息集,然后我通过 XElement.Parse 进行解析。一旦解析为 XElement 实例,我添加一个

回答 2 投票 0

C#中通过System.Linq获取元素的属性Name和Value

我有一个自定义配置文件。 我有一个自定义配置文件。 <Students> <student> <Detail Name="abc" Class="1st Year"> <add key="Main" value="web"/> <add key="Optional" value="database"/> </Detail> </student> </Students> 我通过IConfigurationHandler接口实现来读取这个文件。 当我读取 Detail 元素的 childNode 属性时。它将以下结果返回到 IDE 的立即窗口中。 elem.Attributes.ToObjectArray() {object[2]} [0]: {Attribute, Name="key", Value="Main"} [1]: {Attribute, Name="value", Value="web"} 当我尝试在控制台上书写时 Console.WriteLine("Value '{0}'",elem.Attributes.ToObjectArray()); 它确实让我回归 Value : 'System.Configuration.ConfigXmlAttribute' elem.Attributes.Item(1)方法为我提供了名称和值详细信息,但在这里我需要传递我当前不知道的属性的索引值。 我想通过LINQ查询获取属性的名称和值,并在控制台上单独显示每个childNode属性,如下所示: Value : Name="Key" and Value="Main" Name="value", Value="web" 我怎样才能实现这一目标? 如果您想使用此Xml库,您可以使用以下代码获取所有学生及其详细信息: XElement root = XElement.Load(file); // or .Parse(string) var students = root.Elements("student").Select(s => new { Name = s.Get("Detail/Name", string.Empty), Class = s.Get("Detail/Class", string.Empty), Items = s.GetElements("Detail/add").Select(add => new { Key = add.Get("key", string.Empty), Value = add.Get("value", string.Empty) }).ToArray() }).ToArray(); 然后要迭代它们,请使用: foreach(var student in students) { Console.WriteLine(string.Format("{0}: {1}", student.Name, student.Class)); foreach(var item in student.Items) Console.WriteLine(string.Format(" Key: {0}, Value: {1}", item.Key, item.Value)); } 您可以使用 Linq Select 和 string.Join 来获得您想要的输出。 string.Join(Environment.NewLine, elem.Attributes.ToObjectArray() .Select(a => "Name=" + a.Name + ", Value=" + a.Value) ) 这将获取您在问题中所述的 Detail 元素的子元素的所有属性。 XDocument x = XDocument.Parse("<Students> <student> <Detail Name=\"abc\" Class=\"1st Year\"> <add key=\"Main\" value=\"web\"/> <add key=\"Optional\" value=\"database\"/> </Detail> </student> </Students>"); var attributes = x.Descendants("Detail") .Elements() .Attributes() .Select(d => new { Name = d.Name, Value = d.Value }).ToArray(); foreach (var attribute in attributes) { Console.WriteLine(string.Format("Name={0}, Value={1}", attribute.Name, attribute.Value)); } 如果您在 object[] 中具有 Attributes,如您所写,可以通过 来嘲笑 var Attributes = new object[]{ new {Name="key", Value="Main"}, new {Name="value", Value="web"} }; 那么问题是你有匿名类型,其名称无法轻易提取。 看一下这段代码(您可以将其粘贴到 LinqPad 编辑器窗口的 main() 方法中来执行): var linq=from a in Attributes let s = string.Join(",",a).TrimStart('{').TrimEnd('}').Split(',') select new { Value = s[0].Split('=')[1].Trim(), Name = s[1].Split('=')[1].Trim() }; //linq.Dump(); 由于您无法访问 object[] 数组内变量 Attributes 的 Name 和 Value 属性,因为编译器对您隐藏了它们,因此技巧是使用 Join(",", a)绕过这个限制的方法。 之后您需要做的就是trim和split生成的字符串,最后创建一个具有Value和Name属性的新对象。 如果您取消注释 LinqPad 中的 linq.Dump(); 行,您可以尝试一下 - 它会返回您想要的内容,并且还可以通过 Linq 语句进行查询。

回答 4 投票 0

用一个黑斜杠替换双反斜杠不起作用

我正忙于创建一个 XDocument 对象。在其中一个元素中,我需要添加域名和服务帐户。 服务帐户的形式如下: 我的域名\我的服务帐户 我需要标签...

回答 3 投票 0

使用 XDocument 创建 XML,或使用 xsd.exe 和 XmlSerializer 从 XSD 架构创建 XML?

当您可以使用 XDocument 时,为什么要使用 xsd.exe 工具为 XSD 模式创建类,然后使用序列化器创建 XML 文件。 我是否应该始终使用 XDocument 并通过

回答 1 投票 0

如何循环遍历 XML 文件并从元素中提取特定属性

我有一个如下所示的 XML 文件; ; DltAdj220801-1&...

回答 4 投票 0

当输入完整的xml字符串时,XElement.Parse是否会处理外部DTD?

我们的静态代码分析器报告执行 XElement.Parse 的行上不受限制的文档类型的安全问题。该方法的输入是某些 API 调用的结果。 根据

回答 1 投票 0

powertools 中的自闭合标签

在打开的 OpenXmlPowerTools 中,当空时,所有元素都会实现自关闭标签。 例如。 或者 这不是有效的 html。如何防止这种情况。 或者我要对我进行正则表达式... 在打开的 OpenXmlPowerTools 中,当空时,所有元素都会实现自关闭标签。 例如 <div /> 或 <td /> 这不是有效的 html。如何防止这种情况。 或者我必须通过结果进行正则表达式来替换它们:-( 但看来,这不是powertools的问题。 linq to xml 是这样做的: var tc = new XElement(W.tc); 结果 <tc xmlns="http://schemas.openxmlformats.org/wordprocessingml/2006/main" /> 那么有没有办法避免这种情况呢? 如果其他人遇到这个问题,我将使用以下方法: 在 ChatGpt 的帮助下(经过多次尝试),正则表达式现在是我的解决方案: 您可以调用该函数,例如与 string fixedHtml = FixSelfClosingTags(htmlContent,"div|a|td"); 只需用管道分隔标签 public static string FixSelfClosingTags(string html, string tags) { //({tags}): Captures the specified tags (e.g., div, a, td) //(\s[^>]*)?: Captures the space and attributes if they exist, ensuring that the space is only added if attributes are present. // If there are no attributes, this group is optional, avoiding extra spaces. string pattern = $@"<({tags})(\s[^>]*)?\/>"; //string.IsNullOrWhiteSpace(attributes): // This condition checks if there are no attributes or just whitespace. If true, it converts the tag into <tag></tag> without any space. // Otherwise: The tag is converted with attributes, preserving the space. // string fixedHtml = Regex.Replace(html, pattern, m => { string tagName = m.Groups[1].Value; string attributes = m.Groups[2].Value; return string.IsNullOrWhiteSpace(attributes) ? $"<{tagName}></{tagName}>" : $"<{tagName}{attributes}></{tagName}>"; }); return fixedHtml; }

回答 1 投票 0

使用 linq to xml 搜索 xml 文件并操作属性

实际上,我正在尝试更改 xml 文件中的一个元素的属性。我仍然无法选择 xml 文件中的元素。我的 xml 文件看起来像这样(缩短): 实际上我正在尝试更改 xml 文件中一个元素的属性。我仍然无法选择 xml 文件中的元素。我的 xml 文件看起来像这样(缩短): <?xml version="1.0" encoding="utf-8"?> <settingData xmlns="head.de"> <version>4.9.2.1</version> <setting name="strEdmServiceUrl" value="" /> </settingData> 当我尝试使用 xelDllSettings.Element( "settingData" ) 选择元素时,引发的错误是空引用。我已经检查过 xelDllSettings 实际上是我的 xml 文件。 到目前为止,我操作 xml 文件的代码如下所示: String strEdmServiceUrl = "Text to add in value attribute"; XElement xelDllSettings = XElement.Load( CORRECT_FILEPATH ); xelDllSettings.Element( "settingData" ).Elements( "setting" ).FirstOrDefault( att => ( String )att.Attribute( "value" ) == "strEdmServiceUrl" ).SetAttributeValue( "value", strEdmServiceUrl ); xelDllSettings.Save( CORRECT_FILEPATH, SaveOptions.None ); 如何访问正确的元素(通过“name”属性选择)并更改“value”属性的值? 请尝试以下使用 LINQ to XML API 的解决方案。自 2007 年以来,它在 .Net Framework 中可用。 c# void Main() { const string FILENAME = @"e:\Temp\DevEV.xml"; const string NEW_FILENAME = @"e:\Temp\DevEV_new.xml"; XDocument xdoc = XDocument.Load(FILENAME); XNamespace ns = xdoc.Root.GetDefaultNamespace(); var attr = xdoc.Descendants(ns + "setting")? .Where(d => (string)d.Attribute("name")?.Value == "strEdmServiceUrl") .FirstOrDefault()?.Attribute("value"); attr.Value = "999"; Console.WriteLine(xdoc); xdoc.Save(NEW_FILENAME); } 输出 <settingData xmlns="head.de"> <version>4.9.2.1</version> <setting name="strEdmServiceUrl" value="999" /> </settingData>

回答 1 投票 0

C# Linq to XML - 将命名空间保留在父节点中,同时从子节点中删除它们

所以我通过 LINQ to XML 创建了这个 XML 树,如下所示: XNamespace xNamespace = "urn:OECD:StandardAuditFile-Tax:PT_"; X元素主要 = new XElement(xNamespace + "Aud...

回答 1 投票 0

Linq to XMLWhere 子句不区分大小写

我使用此代码来检索存储在 XML 文件中的登录信息。我遇到的问题是我想让“where”条件不区分大小写,以便它可以更轻松地匹配

回答 1 投票 0

有没有办法创建不可变(只读)XDocument?

我有一个返回 XElement 的 API,并且我希望这些 XElement 背后的文档是不可变的(只读)。我需要它用于: 不要让开发人员能够意外更改它:) 改善

回答 3 投票 0

使用 LINQ-to-XML,如何避免在调用 .Descendants() 后取回后代上的详细命名空间?

当我有一个 XDocument 并且我知道一个名称空间但不知道它的前缀,并且我想获得带有前缀而不是名称空间的某个后代(例如,与原始 XML 字符串中完全相同)时,如何...

回答 1 投票 0

获取xelement属性值

我有一个如下所示的 XElement: 我怎样才能使用XML来提取...

回答 5 投票 0

向现有 XDocument 添加命名空间

我需要使用 Linq to xml 操作一些 xml 文件。 我有一个已加载的现有 XDocument 现在我似乎无法向其添加名称空间。 我愿意: //将现有的 xml 加载到 XDocument 中

回答 2 投票 0

如何获取XDocument对象中的属性

我有这个xml 我希望我的代码能够做这样的事情 if (xdoc.getAttr("第一个")=="true")

回答 3 投票 0

X文档如何评论元素

我只想知道如何使用 XDocument 注释整个元素。 XDocument doc = XDocument.Parse(" ... 我只是想知道如何使用 XDocument 注释整个元素。 XDocument doc = XDocument.Parse("<configuration> <connectionString> ... </connectionString> <configuration>"); /*Something like that*/ doc.Root.Element("connectionStrings").NodeType = XComment; /*??*/ 也许是这样的: var element = doc.Root.Element("connectionStrings"); element.ReplaceWith(new XComment(element.ToString())); 输入/输出示例: 之前: <root> <foo>Should not be in a comment</foo> <connectionStrings> <nestedElement>Text</nestedElement> </connectionStrings> <bar>Also not in a comment</bar> </root> 之后: <root> <foo>Should not be in a comment</foo> <!--<connectionStrings> <nestedElement>Text</nestedElement> </connectionStrings>--> <bar>Also not in a comment</bar> </root> 如果需要,请添加换行符... 这就是您要找的吗? 如果有人想知道如何进行多行: public static class Extensions { internal static void AddMultilineComment(this XDocument xDoc, string[] lines) { var builder = new List<string> { Environment.NewLine }; builder.AddRange(lines); builder.Add(Environment.NewLine); xDoc.Add(new XComment(string.Join(Environment.NewLine, builder))); } } 用途: [TestMethod] public void TryIt() { var xDoc = new XDocument(); xDoc.AddMultilineComment( new string[] { "This excellent post answered my original ", "question, so then it seemed like a handy", "thing to write a multiline extension!", }); xDoc.Add( new XElement("connectionString", new XAttribute("uri", $"{new Uri("https://www.ivsoftware.com")}"))); } 结果:

回答 2 投票 0

如何根据 XDocument 的子节点对 XDocument 父节点进行排序?

在 C# 中,我尝试使用 OrderByDescending 对 XDocument 进行排序。目标是读取包含日期/时间戳的子节点之一并对父节点重新排序。 我从保存的 XML 加载...

回答 2 投票 0

为什么我无法使用 C# 从此 XSL 脚本获取链接的 CSS 文件列表?

这是我的 XSL 文件的一部分: 这是我的 XSL 文件的一部分: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> <xsl:output method="html" indent="yes" version="4.01" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/> <xsl:param name="CSSFile1"></xsl:param> <xsl:template match="/"> <html xmlns="http://www.w3.org/1999/xhtml"> <xsl:choose> <xsl:when test="//Settings/ForeignGroupMode=1"> <xsl:attribute name="lang"> <xsl:value-of select="//Settings/ForeignGroupLanguageCode"/> </xsl:attribute> <xsl:attribute name="dir"> <xsl:value-of select="//Settings/ForeignGroupDirection"/> </xsl:attribute> </xsl:when> <xsl:otherwise> <xsl:attribute name="lang"> <xsl:value-of select="//Settings/LanguageCode"/> </xsl:attribute> <xsl:attribute name="dir"> <xsl:value-of select="//Settings/Direction"/> </xsl:attribute> </xsl:otherwise> </xsl:choose> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <xsl:choose> <xsl:when test="$CSSFile1 !=''"> <style type="text/css"> <xsl:value-of select="$CSSFile1"/> </style> </xsl:when> <xsl:otherwise> <link rel="stylesheet" type="text/css" href="Workbook-S-140-Legacy.css"/> </xsl:otherwise> </xsl:choose> <title> <xsl:value-of select="//Labels/Congregation"/>&#160;<xsl:value-of select="//Labels/Title" /> </title> </head> <body> </body> </html> </xsl:template> 它有 CSS 链接,例如: <link rel="stylesheet" type="text/css" href="Workbook-S-140-Legacy.css"/> 我尝试编写一个 C# 例程来为我提供所有链接的 CSS 文件的列表: public string[] GetLinkedCssFilesList(string xslFilePath) { XDocument document = XDocument.Load(xslFilePath); List<string> cssFiles = new List<string>(); var cssLinks = document.Descendants("link"); foreach(var css in cssLinks) { cssFiles.Add(css.Attribute("href").Value); } return cssFiles.ToArray(); } 但是结果列表是空的。为什么? 注意 XSL 中的默认 xml 命名空间声明 xmlns="http://www.w3.org/1999/xhtml"。 link 元素属于 http://www.w3.org/1999/xhtml xml 命名空间。 您在检索它们时需要包含该内容。 XNamespace ns = "http://www.w3.org/1999/xhtml"; var cssLinks = document.Descendants(ns + "link");

回答 1 投票 0

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