Есть такой xml-документ:
<Capability>
<Layer queryable="1">
<Name>infras_0</Name>
<Layer displayField="id" queryable="1" visible="1">
<Name>BBRQ_копия20170315084719786</Name>
<Title>BBRQ copy</Title>
<Style>
<Name>default</Name>
</Style>
<Attributes>
<Attribute precision="0" length="-1" editType="TextEdit" type="int" comment="" name="id" />
<Attribute precision="0" length="-1" editType="TextEdit" type="qlonglong" comment="" name="objectid" />
<Attribute precision="-1" length="10" editType="TextEdit" alias="Код классификации" type="QString" comment="" name="код_класси" />
<Attribute precision="-1" length="100" editType="TextEdit" type="QString" comment="" name="наименован" />
<Attribute precision="-1" length="100" editType="TextEdit" type="QString" comment="" name="подпись" />
<Attribute precision="-1" length="-1" editType="TextEdit" type="double" comment="" name="uwi" />
<Attribute precision="-1" length="100" editType="TextEdit" type="QString" comment="" name="предприяти" />
<Attribute precision="-1" length="50" editType="TextEdit" type="QString" comment="" name="площадь" />
</Attributes>
</Layer>
</Layer>
</Capability>
То что уже написано:
class Program
{
static void Main(string[] args)
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load("input.xml");
XmlElement xRoot = xDoc.DocumentElement;
foreach (XmlNode xnode in xRoot)
{
foreach (XmlNode childnode in xnode.ChildNodes)
{
// получаем атрибут name
if (childnode.Name == "Name")
{
Console.WriteLine("Name: {0}", childnode.InnerText);
Console.WriteLine();
}
foreach (XmlNode childnode1 in childnode)
{
if (childnode1.Name == "Name")
{
Console.WriteLine("\tName: {0}", childnode1.InnerText);
}
if (childnode1.Name == "Title")
{
Console.WriteLine("\tTitle: {0}", childnode1.InnerText);
}
}
Console.WriteLine();
}
}
Console.ReadKey();
}
}
Результат выполнения:
Не обращайте внимание на последние 2 вывода, просто исходный xml-документ больше, не стал зассорять пространство. Вопрос в том, как получить доступ к
<Attributes>
...
</Atrributes>
И его элементам в xml-документе. Как я понял это XNode, но при обращении к childnode1.ChildNodes приходит null.
Решение проблемы:
class Program
{
static void Main(string[] args)
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load("input.xml");
XmlElement xRoot = xDoc.DocumentElement;
foreach (XmlNode xnode in xRoot)
{
foreach (XmlNode childnode in xnode.ChildNodes)
{
// получаем атрибут name
if (childnode.Name == "Name")
{
Console.WriteLine("Name: {0}", childnode.InnerText);
Console.WriteLine();
}
foreach (XmlNode childnode1 in childnode)
{
if (childnode1.Name == "Name")
{
Console.WriteLine("\tName: {0}", childnode1.InnerText);
}
if (childnode1.Name == "Title")
{
Console.WriteLine("\tTitle: {0}", childnode1.InnerText);
}
//ловим Node с именем "Attributes"
if (childnode1.Name == "Attributes")
{
//делаем цикл по ChildNodes
foreach (XmlNode attr in childnode1.ChildNodes)
{
XmlNode k = attr.Attributes.GetNamedItem("name");
Console.WriteLine("\t"+k.Value);
}
}
}
Console.WriteLine();
}
}
Console.ReadKey();
}
}
Оказывается при объявлении переменной вот так:
var attr = childnode1.ChildNodes;
VS почему то думает, что "attr" является типом object и присваивает значение null. Поэтому в данном случае лучше обойтись без var и указывать тип переменной:
XmlNode attr = childnode1.ChildNodes;
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Не пытался вникнуть в то что вы делаете там, но вот вам скрин с ошибками
Есть xml файл с множеством элеменотовСтроки выглядят так:
В приложении при изначальном запуске - отсутствуют иконкиОднако в ресурсах соответствующие Image с заданными ключами присутствуют