3

我正在通过 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 内容?

4

2 回答 2

8

检查有关 XmlDocument.GetElementById 方法的 MSDN 文档

DOM 实现必须具有定义哪些属性属于 ID 类型的信息。尽管可以在 XSD 模式或 DTD 中定义类型 ID 的属性,但此版本的产品仅支持在 DTD 中定义的属性。除非在 DTD 中如此定义,否则名为“ID”的属性不属于 ID 类型。未知属性是否为 ID 类型的实现应返回 null。

事实上,您必须修改您的 XML 文件以指定“ID”的含义。如果您不想这样做,请使用带有XPath的select方法。

所以你需要:

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'
于 2013-11-05T10:36:16.770 回答
3

我建议您使用 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']");
于 2013-11-05T10:43:10.917 回答