从XML中获取值,这些值记为“;值=xx”;没有装箱
本文关键字:xx 记为 获取 XML | 更新日期: 2023-09-27 18:26:11
我有一个XML文件,里面看起来像这样:
<Data>
<INFO>
..
...
<JOB_NAME value="filename.pdf"/>
<useless_info value="some_info"/>
<TIMESTAMP value="20120210075304"/>
<more_useless_info value="012345"/>
...
..
</INFO>
<INFO>
..
...
<JOB_NAME value="filename2.pdf"/>
<useless_info value="some_info"/>
<TIMESTAMP value="20120210073487"/>
<more_useless_info value="012345"/>
...
..
</INFO>
</Data>
我想做的是将特定的信息写入字符串,这样以后我就可以将这些信息写入文本文件或新的XML文件。我在这里找到了这个例子:http://www.csharp-examples.net/xml-nodes-by-name/我的代码有点工作。不完全,因为它没有得到价值。我的代码如下:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(FileNameTextBox.Text);
XmlNodeList xnList = xmlDoc.SelectNodes("/Data/INFO");
foreach (XmlNode xn in xnList)
{
string jobName = xn["JOB_NAME"].InnerText;
string timeStamp = xn["TIMESTAMP"].InnerText;
MessageBox.Show(timeStamp + jobName); //for testing
}
我认为这与我想要获得的信息没有像<box>info</box>
那样被装箱有关我现在找不到如何从xml文件中获取案例中的信息。有人能帮我一把吗?非常感谢。
您需要选择每个INFO节点的JOB_NAME和TIMESTAMP子节点,然后获取它们的属性,然后获取"Value"属性的Value。
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(FileNameTextBox.Text);
XmlNodeList xnList = xmlDoc.SelectNodes("/Data/INFO");
foreach (XmlNode xn in xnList)
{
string jobName = xn.SelectSingleNode("JOB_NAME").Attributes["value"].Value;
string timeStamp = xn.SelectSingleNode("TIMESTAMP").Attributes["value"].Value;
MessageBox.Show(timeStamp + jobName); //for testing
}
但是要小心这一点,因为如果任何INFO节点不同时包含JOB_NAME和TIMESTAMP节点,并且其中任何一个节点都没有属性"value",则可能会得到NullReferenceException。
回答您的以下评论:
string vendorName = xn.SelectSingleNode("JOB_NAME").Attributes["vendor-name"].Value;
string mediaName = xn.SelectSingleNode("JOB_NAME").Attributes["media-name"].Value;
innerText不起作用是正确的,因为在您的示例中,"value"是一个属性。
string jobName = xn["JOB_NAME"].Attributes["value"].Value;
string timeStamp = xn["TIMESTAMP"].Attributes["value"].Value;
修正并测试。此方法或SelectSingleNode应该可以正常工作。
如果您想迭代所有INFO
元素并读取包含的JOB_NAME
和TIMESTAMP
的value
属性,那么Tobsey的答案是正确的,并将给出所需的结果。
如果您打算从Xml文档中查询特定的值,则应该使用XPath查询,而不是在一组节点上迭代:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(FileNameTextBox.Text);
string jobName = xmlDoc.SelectSingleNode("//JOB_NAME/@value").Value;
string timeStamp = xmlDoc.SelectSingleNode("//TIMESTAMP/@value").Value;
更新
如果您有重复的INFO
节点,但只对第一个感兴趣,则可以将查询更改为只查看第一个:
string jobName = xmlDoc.SelectSingleNode("//INFO[1]/JOB_NAME/@value").Value;
string timeStamp = xmlDoc.SelectSingleNode("//INFO[1]/TIMESTAMP/@value").Value;
Xpath查询//INFO[1]/JOB_NAME/@value
是//INFO[position() = 1]/JOB_NAME/@value
的简写表达式,它将检查节点在Xml文档中的位置。
小心!如果.SelectSingleNode
返回null
,上面的简化示例将失败
您应该在节点中获得名为"value"的属性的Value
属性:
string jobName = xn.SelectSingleNode("JOB_NAME").Attributes["value"].Value;