gpt4 book ai didi

c# - 如何正确解析具有任意 namespace 的 XML 文档

转载 作者:数据小太阳 更新时间:2023-10-29 01:48:25 27 4
gpt4 key购买 nike

我正在尝试解析使用名为 MARCXML 的模式的标准 XML 文档来自各种来源。

这是需要处理的示例 XML 文件的前几行...

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<marc:collection xmlns:marc="http://www.loc.gov/MARC21/slim" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
<marc:record>
<marc:leader>00925njm 22002777a 4500</marc:leader>

还有一个没有命名空间前缀...

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<collection xmlns="http://www.loc.gov/MARC21/slim">
<record>
<leader>01142cam 2200301 a 4500</leader>

关键点:为了让 XPath 在程序中进一步解析,我必须通过正则表达式例程将命名空间添加到 NameTable(默认情况下不添加它们).这对我来说似乎没有必要。

Regex xmlNamespace = new Regex("xmlns:(?<PREFIX>[^=]+)=\"(?<URI>[^\"]+)\"", RegexOptions.Compiled);

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlRecord);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmlDoc.NameTable);

MatchCollection namespaces = xmlNamespace.Matches(xmlRecord);
foreach (Match n in namespaces)
{
nsMgr.AddNamespace(n.Groups["PREFIX"].ToString(), n.Groups["URI"].ToString());
}

XPath 调用看起来像这样......

XmlNode leaderNode = xmlDoc.SelectSingleNode(".//"+ LeaderNode, nsMgr);

其中 LeaderNode 是一个可配置的值,在第一个示例中等于 "marc:leader",在第二个示例中等于 "leader" .

是否有更好、更有效的方法来做到这一点?注意:欢迎提出使用 LINQ 解决此问题的建议,但我主要想知道如何使用 XmlDocument 解决此问题。

编辑:我采纳了 GrayWizardx 的建议,现在有了以下代码......

if (LeaderNode.Contains(":"))
{
string prefix = LeaderNode.Substring(0, LeaderNode.IndexOf(':'));
XmlNode root = xmlDoc.FirstChild;
string nameSpace = root.GetNamespaceOfPrefix(prefix);
nsMgr.AddNamespace(prefix, nameSpace);
}

现在不再依赖 Regex!

最佳答案

如果您知道文档中将有一个给定元素(例如根元素),您可以尝试使用 GetNamespaceOfPrefix .

关于c# - 如何正确解析具有任意 namespace 的 XML 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3981407/

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