#c# #xml #.net-core
#c# #xml #.net-ядро
Вопрос:
У меня есть XML, подобный следующему:
<config>
<EPackets>
<packet>
<id> 1 </id>
<name> packet1 </name>
<variables>
<variable>
<id> 1 </id>
<name> packet1var1 </id>
</variable>
<variable>
<id> 2 </id>
<name> packet1var2 </id>
</variable>
</variables>
</packet>
<packet>
<id> 2 </id>
<name> packet2 </name>
<variables>
<variable>
<id> 1 </id>
<name> packet2var1 </id>
</variable>
<variable>
<id> 2 </id>
<name> packet2var2 </id>
</variable>
</variables>
</packet>
</EPackets>
</config>
Для краткости давайте предположим, что я хочу печатать указанные узлы только с помощью консоли следующим образом:
Config contains:
packet: packet1
id: 1
variables of the packet:
-- name: packet1var1
-- id: 1
-- name: packet1var2
-- id: 2
packet: packet2
id: 2
variables of the packet:
-- name: packet2var1
-- id: 1
-- name: packet2var2
-- id: 2
На данный момент я могу получить внешнюю информацию, но когда я пытаюсь получить доступ к внутренним переменным элемента для каждого пакета, ничего не возвращается (внутренний foreach):
List<XmlNode> PacketList = variablesSettings.getNodes("config.EPackets.packet");
log("Config contains: ", DEBUG);
foreach (XmlNode packet in PacketList)
{
int packetId = Convert.ToInt32(packet.SelectSingleNode("id").InnerText);
String packetName = packet.SelectSingleNode("nombre").InnerText;
log("packet: " packetName, DEBUG);
log("id: " packetId, DEBUG);
log("variables of the packet: ", DEBUG);
foreach (XmlNode variable in packet.SelectNodes("variables.variable"))
{
String variableName = variable.SelectSingleNode("name").InnerText;
String variableId = variable.SelectSingleNode("id").InnerText;
log("name: " variableName, DEBUG);
log("id: " variableId, DEBUG);
}
}
Что я здесь делаю не так? любая информация будет оценена.
Подводя итог, проблема заключается в том, что когда я пытаюсь получить внутренние узлы (переменные) из каждого пакета, используя эту строку foreach (XmlNode variable in packet.SelectNodes("variables.variable")
, программа завершается (она находит 0 узлов с этим именем)
Комментарии:
1. String variableName = packet . SelectSingleNode(«имя»). innerText; String variableId = packet. SelectSingleNode(«id»). innerText; — следует ли использовать из переменной вместо пакета?
2. @Mohan вы правы, но это была опечатка, у меня есть это с vriable в моем коде.
3. Вы используете неправильный XPath
SelectNode
. Вы должны использовать/
(не.
) в качестве селектора потомков. Правильный XPathpacket.SelectNodes("variables/variable")
. Однако я не уверенvariablesSettings.getNodes(…)
, потому что мы не знаем, что это за типvariablesSettings
.4. @PeterWolf Я понимаю, что ты имеешь в виду. Я нашел обходной путь, в котором я могу выбрать последний дочерний элемент пакета, а затем выполнить итерацию там (это дает желаемый результат)