【问题标题】:How can I get a node by id in XML?如何通过 XML 中的 id 获取节点?
【发布时间】: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。
  • 谢谢大家的回答,不过西里尔的回答符合我的要求

标签: c# .net xml parsing


【解决方案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']");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多