如何检查xml文档是否有某个属性列表?

时间:2011-07-12 17:36:21

标签: c# .net xml xmldocument

我正在尝试使用C#和xml,我正在尝试读取我要验证的XML文件,如果缺少“NumberOfDays”,“NumberOfBooks”,“NumberOfExam”,“CurrentDate”。我想用它们添加它们。

我有以下xmldocument:

<?xml version="1.0" encoding="utf-8" ?>
<MySample>
  <Content>
    <add  key="NumberOfDays" value="31"  />
    <add  key="NumberOfBooks" value="20"  />
    <add  key="NumberOfExam" value="6"  />
    <add  key="CurrentDate" value="15 - Jul - 2011"  />
  </Content>
</MySample>

我正在使用

在c#中编写示例应用程序

-------- --------编辑

感谢 AresAvatar 为您的回复。

但如果值存在,我想更新其值,即如果让我们说

<add  key="NumberOfExam" value=""  />

我想将值更改为6

2 个答案:

答案 0 :(得分:3)

您可以获取这样的节点列表:

// Get a list of which nodes exist
XmlDocument doc = new XmlDocument();
doc.LoadXml(myXml);
List<string> existingNodes = new List<string>();
XmlNodeList bookNodes = doc.SelectNodes("/MySample/Content/add");
foreach (XmlNode nextNode in bookNodes)
{
    foreach (XmlAttribute nextAttr in nextNode.Attributes)
        existingNodes.Add(nextAttr.InnerText);
}

您可以像这样添加缺少的节点:

// Add nodes
XmlNode addRoot = doc.SelectSingleNode("/MySample/Content");
XmlElement addme = doc.CreateElement("add");
addme.SetAttribute("NumberOfDays", "31");
addRoot.AppendChild(addme);

您可以设置现有节点的值,如下所示:

// Update a node
foreach (XmlNode nextNode in bookNodes)
{
    foreach (XmlAttribute nextAttr in nextNode.Attributes)
    {
        switch (nextAttr.Name)
        {
            case "NumberOfDays":
                ((XmlElement)nextNode).SetAttribute("value", "31");
                break;
            // etc.
        }
    }
}

答案 1 :(得分:1)

首先,如果您可以控制生成的XML(如果您自己创建),请避免使用此模式:

<?xml version="1.0" encoding="utf-8" ?>
<MySample>
  <Content>
    <add  key="NumberOfDays" value="31"  />
    <add  key="NumberOfBooks" value="20"  />
    <add  key="NumberOfExam" value="6"  />
    <add  key="CurrentDate" value="15 - Jul - 2011"  />
  </Content>
</MySample>

使用该架构要容易得多:

<?xml version="1.0" encoding="utf-8" ?>
    <MySample>
      <Content>
       <Adds>
        <NumberOfDays>31<NumberOfDays/>
        <NumberOfBooks>20<NumberOfBooks/>
        <NumberOfExam>6<NumberOfExam/>
        <CurrentDate>5 - Jul - 2011<CurrentDate/>
       </Adds>
      </Content>
    </MySample>

然后:

XmlDocument doc = new XmlDocument();
doc.Load("YourXmlPath");
XmlNode firstNode = doc["MySample"];
if(firstNode != null)
{
    XmlNode secondNode = firstNode["Content"];
    if(secondNode != null)
    {
        XmlNode thirdNode = secondNode["Adds"];
        if(thirdNode != null)
        {
            if(thirdNode["NumberOfDays"] == null) //The "NumberOfDays" node does not exist, we create it.
            {
                XmlElement newElement = doc.CreateElement("NumberOfDays");
                newElement.InnerXml = 31;
                thirdNode.AppendChild(newElement);                    
            }
            //Do the same for the other nodes...
        }
    }
}
doc.Save("YourXmlPath");

请记住在每个节点上检查null,或者将整个块放入try / catch。

在您完成更改后保存XML。

XmlDocument.Load()函数在内存中加载XML,因此您可以在不进行“盲循环”的情况下检查任何节点。