如何通过 XML 中的 id 获取节点?

Posted

技术标签:

【中文标题】如何通过 XML 中的 id 获取节点?【英文标题】:How can I get a node by id in XML? 【发布时间】:2013-11-16 04:42:15 【问题描述】:

我正在通过 id 使用 XML 创建语言翻译

XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <word id="1">Word1_English</word>
    <word id="2">Word2_English</word>
    <word id="3">Word3_English</word>

    <word id="10001">Word1_French</word>
    <word id="10002">Word2_French</word>
    <word id="10003">Word3_French</word>

    <word id="20001">Word1_Chinese</word>
    <word id="20002">Word2_Chinese</word>
    <word id="20003">Word3_Chinese</word>
</root>

后面的代码:

XmlDocument xmlDocument;
FileInfo fileInfo;
XmlNodeList xmlNodeList;

string xPath = "D:\XML\LanguagePack.xml";
fileInfo = new FileInfo(xPath);
xmlDocument = new XmlDocument();
xmlDocument.Load(fileInfo.FullName);

xmlNodeList = xmlDocument.GetElementById("10001");
return xmlNodeList[0].InnerText; //should return 'Word1_French'

此代码不起作用,xmlNodeList 为空。 如何获取 Word1_French 内容?

【问题讨论】:

它现在返回什么? 贴出的代码有问题吗? 由于 GetElementById 只能返回单个元素,您应该将结果分配给 XmlNode,而不是 XmlNodeList。 谢谢大家的回答,不过西里尔的回答符合我的要求 【参考方案1】:

查看MSDN documentation on XmlDocument.GetElementById Method:

DOM 实现必须具有定义哪个 属性的类型为 ID。虽然类型 ID 的属性可以 在 XSD 模式或 DTD 中定义,此版本的产品 仅支持 DTD 中定义的那些。 名称为“ID”的属性是 除非在 DTD 中如此定义,否则不是 ID 类型。实现它的地方 未知属性是否为类型 ID 预期 返回空值。

事实上,您必须修改您的 XML 文件以指定您所说的“ID”是什么意思。如果您不想这样做,请使用 select 方法和 XPath。

所以你需要:

string filePath = "D:\\XML\\LanguagePack.xml";
var fileInfo = new FileInfo(filePath);
var xmlDocument = new XmlDocument();
xmlDocument.Load(fileInfo.FullName);

var node = xmlDocument.SelectSingleNode("//*[@id='10001']");
return node.InnerText; // return 'Word1_French'

【讨论】:

【参考方案2】:

我建议您使用 LINQ to XML 来解析 XML。它有很好的强类型 API。通过整数 id 获取字符串单词看起来像(需要 System.Xml.Linq 命名空间):

var xdoc = XDocument.Load(filePath);
string word = xdoc.Root.Elements()
                  .Where(w => (int)w.Attribute("id") == id)
                  .Select(w => (string)w)
                  .FirstOrDefault();

甚至更少的 XPath 代码(需要 System.Xml.XPath 命名空间):

string word = (string)xdoc.XPathSelectElement("//word[@id='10001']");

【讨论】:

以上是关于如何通过 XML 中的 id 获取节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过控制 C# 中的属性 ID 在 XML 中添加节点?

如何从 XDocument 获取 XML 节点

如何通过给定的父 ID 将 XML 子节点存储在 PHP 变量中?

在 jsTree 中,如何通过节点 id 获取节点信息?

如何从 xmlnodelist 获取 xml 节点

如何通过 jQuery 更新 XML 节点?