如何通过 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 中添加节点?