从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文件中获取案例中的信息。有人能帮我一把吗?非常感谢。

从XML中获取值,这些值记为“;值=xx”;没有装箱

您需要选择每个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_NAMETIMESTAMPvalue属性,那么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;