gpt4 book ai didi

c# - 无需继续指定默认 namespace 即可解析 XDocument

转载 作者:可可西里 更新时间:2023-11-01 08:22:59 26 4
gpt4 key购买 nike

我有一些 XML 数据(类似于下面的示例),我想读取代码中的值。

为什么我必须指定默认命名空间才能访问每个元素?我原以为所有元素都使用默认命名空间。

是否有更合乎逻辑的方法来实现我的目标?

示例 XML:

<?xml version="1.0" encoding="UTF-8"?>
<ReceiptsBatch xmlns="http://www.secretsonline.gov.uk/secrets">
<MessageHeader>
<MessageID>00000173</MessageID>
<Timestamp>2009-10-28T16:50:01</Timestamp>
<MessageCheck>BX4f+RmNCVCsT5g</MessageCheck>
</MessageHeader>
<Receipts>
<Receipt>
<Status>OK</Status>
</Receipt>
</Receipts>
</ReceiptsBatch>

读取 xml 元素的代码:

XDocument xDoc = XDocument.Load( FileInPath );

XNamespace ns = "http://www.secretsonline.gov.uk/secrets";

XElement MessageCheck = xDoc.Element(ns+ "MessageHeader").Element(ns+"MessageCheck");
XElement MessageBody = xDoc.Element("Receipts");

最佳答案

根据 this answer 的建议,您可以通过从文档的内存副本中删除所有命名空间来完成此操作。我想只有当您知道在生成的文档中不会出现名称冲突时才应该这样做。

/// <summary>
/// Makes parsing easier by removing the need to specify namespaces for every element.
/// </summary>
private static void RemoveNamespaces(XDocument document)
{
var elements = document.Descendants();
elements.Attributes().Where(a => a.IsNamespaceDeclaration).Remove();
foreach (var element in elements)
{
element.Name = element.Name.LocalName;

var strippedAttributes =
from originalAttribute in element.Attributes().ToArray()
select (object)new XAttribute(originalAttribute.Name.LocalName, originalAttribute.Value);

//Note that this also strips the attributes' line number information
element.ReplaceAttributes(strippedAttributes.ToArray());
}
}

关于c# - 无需继续指定默认 namespace 即可解析 XDocument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7387058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com