LINQ-to-XML提供类似SQL的查询体验,用于导航,解析和聚合存储在XML文档中的数据。
注意:这不是语义问题。这并不是询问自闭合标签的含义。这是关于使用 XDocument 执行与本示例文章中使用 C# 提到的相反的操作: 一个 重新...
如何在 C# 中从 XDocument 创建缩进的 XML 字符串?
我有一个 XDocument 对象,ToString() 方法返回没有任何缩进的 XML。如何从中创建包含缩进 XML 的字符串? 编辑:我问如何创建一个内存存储...
我有一个 .NET Web 服务(.asmx,而不是 .svc),它通过 HTTP POST 接受字符串。它接受的字符串是 xml 信息集,然后我通过 XElement.Parse 进行解析。一旦解析为 XElement 实例,我添加一个
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 语句进行查询。
我正忙于创建一个 XDocument 对象。在其中一个元素中,我需要添加域名和服务帐户。 服务帐户的形式如下: 我的域名\我的服务帐户 我需要标签...
使用 XDocument 创建 XML,或使用 xsd.exe 和 XmlSerializer 从 XSD 架构创建 XML?
当您可以使用 XDocument 时,为什么要使用 xsd.exe 工具为 XSD 模式创建类,然后使用序列化器创建 XML 文件。 我是否应该始终使用 XDocument 并通过
当输入完整的xml字符串时,XElement.Parse是否会处理外部DTD?
我们的静态代码分析器报告执行 XElement.Parse 的行上不受限制的文档类型的安全问题。该方法的输入是某些 API 调用的结果。 根据
在打开的 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; }
实际上,我正在尝试更改 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>
C# Linq to XML - 将命名空间保留在父节点中,同时从子节点中删除它们
所以我通过 LINQ to XML 创建了这个 XML 树,如下所示: XNamespace xNamespace = "urn:OECD:StandardAuditFile-Tax:PT_"; X元素主要 = new XElement(xNamespace + "Aud...
我使用此代码来检索存储在 XML 文件中的登录信息。我遇到的问题是我想让“where”条件不区分大小写,以便它可以更轻松地匹配
我有一个返回 XElement 的 API,并且我希望这些 XElement 背后的文档是不可变的(只读)。我需要它用于: 不要让开发人员能够意外更改它:) 改善
使用 LINQ-to-XML,如何避免在调用 .Descendants() 后取回后代上的详细命名空间?
当我有一个 XDocument 并且我知道一个名称空间但不知道它的前缀,并且我想获得带有前缀而不是名称空间的某个后代(例如,与原始 XML 字符串中完全相同)时,如何...
我需要使用 Linq to xml 操作一些 xml 文件。 我有一个已加载的现有 XDocument 现在我似乎无法向其添加名称空间。 我愿意: //将现有的 xml 加载到 XDocument 中
我有这个xml 我希望我的代码能够做这样的事情 if (xdoc.getAttr("第一个")=="true")
我只想知道如何使用 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")}"))); } 结果:
如何根据 XDocument 的子节点对 XDocument 父节点进行排序?
在 C# 中,我尝试使用 OrderByDescending 对 XDocument 进行排序。目标是读取包含日期/时间戳的子节点之一并对父节点重新排序。 我从保存的 XML 加载...
为什么我无法使用 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"/> <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");