Синтаксический анализ внутреннего XML-тега с использованием C#
-
21-12-2019 - |
Вопрос
<career code="17-1011.00">
<code>17-1011.00</code>
<title>Architects</title>
<tags bright_outlook="false" green="true" apprenticeship="false" />
<also_called>
<title>Architect</title>
<title>Project Architect</title>
<title>Project Manager</title>
<title>Architectural Project Manager</title>
</also_called>
<what_they_do>Plan and design structures, such as private residences, office buildings, theaters, factories, and other structural property.</what_they_do>
<on_the_job>
<task>Consult with clients to determine functional or spatial requirements of structures.</task>
<task>Prepare scale drawings.</task>
<task>Plan layout of project.</task>
</on_the_job>
</career>
Я взял этот XML, возвращенный из ONet, и хотел бы проанализировать информацию для использования.Вот код, который я написал, чтобы попытаться проанализировать внутренний текст тегов в разделе , где "входными данными" является Onet XML.
XmlDocument inputXML = new XmlDocument();
inputXML.LoadXml(input);
XmlElement root = inputXML.DocumentElement;
XmlNodeList titleList = root.GetElementsByTagName("also_called");
for (int i = 0; i < titleList.Count; i++)
{
Console.WriteLine(titleList[i].InnerText);
}
Я ожидаю получить список узлов четвертого размера.Однако, когда я распечатываю результат, результат имеет размер 1:"Архитектор проекта, менеджер архитектурного проекта, руководитель архитектурного проекта"
Я неправильно сконструировал свой список заголовков XmlNodeList?Как я могу дополнительно просмотреть и обработать дерево XML, чтобы получить внутренние значения тегов 'title' в разделе 'also_called'?
Решение
Вы получаете элементы имени also_called
.В вашем списке есть только один такой элемент.То, что вы, вероятно, хотите, это получить детей узла also_called
.
Например:
XmlNodeList also_calledList = root.GetElementsByTagName("also_called");
XmlNode also_calledElement = also_calledList[0];
XmlNodeList titleList = also_calledElement.ChildNodes;
foreach (XmlNode titleNode in titleList)
{
Console.WriteLine(titleNode.InnerText);
}
.
Кроме того, рассмотреть возможность использования XDocument
и Linq к XML вместо XmlDocument
- это намного проще использовать:
XDocument root = XDocument.Parse(input);
foreach (XElement titleNode in root.Descendants("also_called").First().Elements())
{
Console.WriteLine(titleNode.Value);
}
. Другие советы
Вам просто нужно немного XPath.При этом выбираются все title
узлы, которые являются дочерними по отношению к первому also_called
.
XmlDocument inputXML = new XmlDocument();
inputXML.LoadXml(input);
foreach(var node in root.SelectNodes("also_called[1]/title"))
{
Console.WriteLine(node.InnerText);
}
Это редкость, когда вам нужно было бы использовать GetElementsByTagName
или ChildNodes
и иже с ними и/или попробуйте проверить узел, чтобы выяснить, тот ли это узел, который вам нужен.Навигация по Xml с помощью XmlDocument
все дело в использовании XPath с помощью которого вы можете указать совсем немного, когда дело доходит до получения узлов, соответствующих определенным критериям;как с точки зрения структуры внутри дерева, так и с точки зрения содержимого.