Как проверить, если XML-документ имеет определенный список атрибутов? - PullRequest
2 голосов
/ 12 июля 2011

Я экспериментирую с 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 ]

3 голосов
/ 12 июля 2011

Вы можете получить список существующих узлов следующим образом:

// 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 голос
/ 12 июля 2011

Прежде всего, если у вас есть контроль над сгенерированным 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");

Просто не забудьте проверить нулевое значение на каждом узле или поместить весь блок в try / catch.

И сохранить XML после внесения изменений.

Функция XmlDocument.Load () загружает XML в память, поэтому вы можете проверять любой узел, не создавая «слепых циклов».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...