xmldocument 相关问题

表示XML文档的原始.NET类型。更现代的版本是XDocument。

XML - 如何获取单个节点而不是整个文档中的子节点?

一直在寻找答案,但找不到任何东西 - 我很新,所以也许我没有找到正确的关键词? 这是我正在使用的 XML 示例 一直在寻找答案,但找不到任何东西 - 我很新,所以也许我没有找到正确的关键词? 这是我正在使用的 XML 示例 <database> <book> <title>A</title> <author> <name>1</name> </author> </book> <book> <title>B</title> <author> <name>2</name> </author> <author> <name>3</name> </author> <author> <name>4</name> </author> <author> <name>5</name> </author> </book> </database> 我正在尝试使用 C# XmlDocument 获取书 A 作者 1,然后获取书 B 作者 2、3、4、5 到目前为止,我正在使用的代码正在循环遍历所有作者,因此我得到了书 A 作者 1, 2, 3, 4, 5 我目前的代码大致如下 XmlDocument doc = new XmlDocument(); doc.Load("myxmlfile"); XmlNode root = doc.SelectSingleNode("database"); XmlNodeList nodelist = root.SelectNodes("book"); foreach (XmlNode n in nodelist) { XmlNodeList authors = root.SelectNodes(".//author"); book.authorstring = ""; foreach (XmlNode author in authors) { book.authorstring = book.authorstring+author.SelectSingleNode("name").InnerText + ", "; } } 我读到了一些内容,如果我在“//”之前使用“.”,它将“锚定”到当前节点,但它似乎不起作用并且正在循环所有节点 我做错了什么或遗漏了什么? 如果我理解正确,你的错误就在这一行: XmlNodeList authors = root.SelectNodes(".//author"); 应该是 XmlNodeList authors = n.SelectNodes(".//author"); 对于未来的读者,我看到这篇文章,但我忘记在我的 xPath 中添加 .。 即(这是 powershell,但这并不重要), 这是错误的,返回了从根节点找到的第一个节点: $descriptionNode = $someNode.SelectSingleNode("//Description") 这是正确的,并返回第一个节点作为该节点的子节点: $descriptionNode = $someNode.SelectSingleNode(".//Description") 这当然是因为//会在任何地方查询,而./会相对查询。 解释得很清楚,但是很容易错过,而且花了一些时间才找到。 方便的备忘单: https://devhints.io/xpath 使用linq2XML..使用起来很简单 XElement doc=XElement.Load("yourXML.xml"); var lstBooks=doc.Descendants("book").Select(x=> new { name=x.Element("title").Value, authors=x.Elements("author").Select(y=>y.Element("name").Value) } ); lstBooks现在包含所有必需的数据 您现在可以这样做 foreach(var book in lstBooks) { book.name;//Name of the book foreach(var author in book) { author;//name of the author } }

回答 3 投票 0

如何使用c#循环遍历xml文档节点以使用xpath存储值

我正在尝试循环下面的 xml 文档 16 我正在尝试循环下面的 xml 文档 <proposer driverId="1"> <conviction convictionId="1"> <code>16</code> </conviction> <conviction convictionId="2"> <code>10</code> </conviction> </proposer> <driver driverId="2"> <conviction convictionId="3"> <code>22</code> </conviction> </driver> 我的想法是获取所有信念代码,无论是提议者还是驱动程序,并将其存储在字符串列表中,然后通过发送索引,我执行 elementAtDefault 来获取代码 DrivingConvictionCode1 = GetConvictionCode(1, risk), DrivingConvictionCode2 = GetConvictionCode(2, risk), DrivingConvictionCode3 = GetConvictionCode(3, risk), 在 GetConvictionCode 方法中,我将索引值与 XmlDoc 一起传递,并调用 GetConvictions 方法,然后执行 Elementatdefault 以基于索引获取 ConvictionCode private string GetConvictionCode(int convictionSrNo, XmlDocument risk) { var convictions = GetConvictions(risk); return convictions.ElementAtOrDefault(convictionSrNo - 1) == null ? string.Empty : convictions[convictionSrNo - 1]; } private List<string> GetConvictions(XmlDocument risk) { var convictions = new List<string>(); foreach (XmlNode selectNode in risk.SelectNodes("/risk/proposer/conviction")) { convictions.AddRange(new[] {selectNode.SelectSingleNode("/risk/proposer/conviction/code").InnerText}); } foreach (XmlNode selectNode in risk.SelectNodes("/risk/driver/conviction")) { convictions.AddRange(new[] {selectNode.SelectSingleNode("/risk/driver/conviction/code").InnerText}); } return convictions; } 我在这里面临的问题是在循环中下一个信念值正在被旧的值取代,所以如果第一次循环它是 16 下一次它应该是 10 但它来了 16。任何人都可以帮忙或告诉我任何其他方式 我期望的输出是 DrivingConvictionCode1 = GetConvictionCode(1, risk) > 16, DrivingConvictionCode2 = GetConvictionCode(2, risk) > 10, DrivingConvictionCode3 = GetConvictionCode(3, risk) > 22, 您应该使用 InnerText 而不是 .SelectSingleNode("<path>").InnerText 来获取值。 foreach (XmlNode selectNode in risk.SelectNodes("/risk/proposer/conviction")) { convictions.AddRange(new[] { selectNode.InnerText }); } foreach (XmlNode selectNode in risk.SelectNodes("/risk/driver/conviction")) { convictions.AddRange(new[] { selectNode.InnerText }); }

回答 1 投票 0

如何将 XML 反序列化为 C# 对象而忽略 xmlns?

给定以下 XML,我如何将它们反序列化为同一个 C# 对象?版本 1.1 本质上向后兼容 1.0,所以我并不真正关心 xmlns 值,但 C# 不这么认为...

回答 1 投票 0

UnauthorizedAccessException:访问路径被拒绝

当尝试加载 xml 文档进行解析时,我不断收到以下错误: System.Private.Xml.dll 中发生“System.UnauthorizedAccessException”类型的异常,但...

回答 1 投票 0

如何让XMLDocument不在自闭合标签上放置空格?

我有一个格式良好、没有任何空格的 XML。一定是这样的。 当我将其加载到 XMLDocument 进行签名时,自闭合标签会获得额外的空白,并且 变成: ...

回答 4 投票 0

'xi'是设置新XmlDocumentFragment的InnerXml时未声明的前缀

我正在尝试向现有 xml 文件添加新节点。该文件定义了 xi 命名空间: 我正在尝试向现有 xml 文件添加新节点。该文件定义了 xi 命名空间: <Module xmlns:xi="http://www.w3.org/2001/XInclude" ... 并且包含节点: <xi:include href="somefile.xml" /> 这加载得很好,我可以在现有节点上进行操作,但是如果我尝试像这样添加新节点: XmlDocumentFragment frag = doc.CreateDocumentFragment(); frag.InnerXml = "<SomeNode SomeAttribute=\"\">" + " <xi:include href=\"SomeFile.xml\" />" + "</SomeNode>"; 我收到“'xi'是未声明的前缀”的 XmlException 我认为片段本身无法识别名称空间是不高兴的,但我没有看到任何直观的方法来解决这个问题。 当我写这个问题时,我有一个可行的想法,并将其发布,以防它对其他人有帮助。我决定在将片段添加到文档后添加有问题的 xml: XmlDocumentFragment frag = doc.CreateDocumentFragment(); frag.InnerXml = "<SomeNode SomeAttribute=\"\">" + "</SomeNode>"; XmlNode newNode = parentNode.AppendChild(frag); newNode.InnerXml = "<xi:include href=\"SomeFile.xml\" />"; 如果有人有更干净的方法来做到这一点。我很想听听它是什么。 在 <xi:include href="somefile.xml" /> 中,xi 是命名空间前缀。 如果使用命名空间前缀,则必须声明。您必须在使用命名空间前缀 xi 的元素之上或之上添加其声明: xmlns:xi="http://www.w3.org/2001/XInclude" 如果您通过以某种方式组装片段来暂时设法避开错误消息,请意识到最终结果才是重要的:如果使用了命名空间但未声明,您仍然会遇到问题。 我想在这里发布一个详细的例子。 下面的代码展示了如何使用 C# 将文本 sinppet 附加到 OneNote 桌面。 你可能知道,OneNote 中的内容存储为 xml,每个节点的前缀为 one。 因此名称空间xmlns:one设置在输入部分的第一行。 xmlns:one=""http://schemas.microsoft.com/office/onenote/2013/onenote"" using System; using System.Xml; using System.Xml.Linq; using Append2OneNote; using Microsoft.Office.Interop.OneNote; class Program { static void Main() { Microsoft.Office.Interop.OneNote.Application onenoteApp = new Microsoft.Office.Interop.OneNote.Application(); string pageId = "{3ACAE6C6-53C5-0C4F-060D-3007A1428E63}{1}{E19561840189956234832620129833010512773022001}"; onenoteApp.GetPageContent(pageId, out var CurrentPageXml); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(CurrentPageXml); XmlNode root = xmlDoc.DocumentElement; var LastOutline = root.LastChild; var LastOEChildren = LastOutline.LastChild; var LastOE = LastOEChildren.LastChild; var pageContent = "Your text content1"; string newXML = $@" <one:OE alignment=""left"" quickStyleIndex=""1"" selected=""partial"" xmlns:one=""http://schemas.microsoft.com/office/onenote/2013/onenote""> <one:T selected=""all""><![CDATA[{pageContent}]]></one:T> </one:OE>"; XmlDocumentFragment xfrag = xmlDoc.CreateDocumentFragment(); xfrag.InnerXml = newXML; LastOEChildren.AppendChild(xfrag); onenoteApp.UpdatePageContent(xmlDoc.InnerXml); } }

回答 3 投票 0

在生产环境(64 GB RAM)中生成非常大的 XML 文档时出现 OutOfMemory 错误 - 在具有 16 GB RAM 的计算机上进行开发时工作正常

我有一个 Web 应用程序,经典 ASP.NET,在具有 64 GB RAM 和 SQL Server 2017 Standard 的 Windwes Server SBE 2016 上运行。 该应用程序是在 VS 2022 最新版本中构建的。 我需要生成一个非常大的 XML,以便...

回答 1 投票 0

XML 在没有 xpath 的情况下读取嵌套节点

我有以下xml。 DocumentEntity=“借款人”|DataType=“表”|Value=“ ...

回答 1 投票 0

将字符串加载到 XmlDocument 后保留空行

我有这些相当大的字符串,其中包含多个换行符” “而且,在某些情况下,我什至可能会有一系列换行符” ...”。这会导致空行,

回答 1 投票 0

使用 XPath 解析 XML 文档

假设我有以下 xml(一个简单的示例) 一个 两个 ...

回答 8 投票 0

XPath 不适用于在 XML 中进行选择

我有一个 XML 文档,但我一生都无法使用 XPath 获取数据。我尝试了所有能找到的样本,但没有成功。我正在尝试提取电子邮件地址。有什么想法吗? XML: &...

回答 2 投票 0

C# 十六进制值 0x12,是无效字符

我正在加载很多xml文档,其中一些返回错误,例如“十六进制值0x12,是无效字符”,并且有不同的字符。如何去除它们?

回答 7 投票 0

如何获取带有标头的 XML (<?xml version="1.0"...)?

考虑以下简单代码,它创建一个 XML 文档并显示它。 XmlDocument xml = new XmlDocument(); XmlElement root = xml.CreateElement("root"); xml.AppendChild(根); Xml评论

回答 4 投票 0

有没有办法使用 ASP.NET API 控制器返回 XML 文件内容?

我正在尝试模拟我无权访问的服务器进行测试。服务器返回我正在测试的客户端读取并加载到 XmlDocument 类中的 XML 文件的内容。 好像...

回答 1 投票 0

当文件编码为 Unicode 时,C# XmlDocument.Load(string) 失败

我想使用 XmlDocument.Load(String) 方法从 xml 文件加载 XMLDocument,但是当我尝试使用它时出现此错误: System.Xml.XmlException:“.”,十六进制值 0x00,无效

回答 1 投票 0

如何从 StringBuilder C# 创建具有多个根的 XML 文件

我是一名机械师,必须开发管理 xml 文件的工具。 我有一个问题,需要你的帮助。 我必须管理的 xml 文件之一有多个根。不要问为什么,我的提供商不会

回答 1 投票 0

Blazor c# - 如何 XmlDocument.load() 本地文件

Blazor(网络组装)新手,所以放轻松:) 我希望能够通过 InputFile 从本地磁盘(大小为 100mb 的区域)选择一个 xml 文件并将其加载到 XmlDocument 中,这样我就可以

回答 2 投票 0

在 PowerShell XmlDocument.CreateElement 中转义冒号

我试图在 CreateElement 方法中转义冒号。例如,我想更改以下内容: $node = $xmldoc.CreateElement("测试:示例") 给我一个看起来像 t 的节点...

回答 1 投票 0

Xml 循环引用

我正在尝试使用下面的类结构生成以下 XML。 ...

回答 2 投票 0

从 XmlNode 中删除 CDATA 标签

我有一个代表以下 xml 的 XmlNode,例如: XmlNode xml.innerText = 我有一个XmlNode代表以下xml例如: XmlNode xml.innerText = <book> <name><![CDATA[Harry Potter]]</name> <author><![CDATA[J.K. Rolling]]</author> </book> 我想更改此节点,使其包含以下内容: XmlNode xml.innerText = <book> <name>Harry Potter</name> <author>J.K. Rolling</author> </book> 任何想法?谢谢! 好吧,如果这正是你所说的,那就很简单了: xml.innerText = xml.innerText.Replace("![CDATA[","").Replace("]]",""); xmlDoc.Save();// xmlDoc is your xml document 我建议您阅读整个 xml 并重写它。您可以像这样读取没有 cdata 的值 foreach (var child in doc.Root.Elements()) { string name = child.Name; string value = child.Value }

回答 2 投票 0

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