У меня есть XML-документ, и я пытаюсь отделить узлы друг от друга. Мне нужен только корневой узел, затем только второй узел, а затем список узлов, существующих во вторых узлах. Я столкнулся с проблемой, когда я удаляю узлы из второго узла или основного узла, мой список становится пустым. Я не понимаю, почему это происходит, особенно из-за этого странного поведения ниже.
class Program
{
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Users\Username\Desktop\Diagram.xml");
XmlNode rootNode = doc.DocumentElement;
XmlNode secondNode = doc.SelectSingleNode(rootNode.Name + "/root");
XmlNodeList nodelist = doc.SelectNodes("//root/mxCell");
Console.WriteLine("-----------------------------------------");
Console.WriteLine(RemoveChildren(rootNode).OuterXml);
Console.WriteLine("-----------------------------------------");
Console.WriteLine(RemoveChildren(secondNode).OuterXml);
Console.WriteLine("-----------------------------------------");
//Console.WriteLine(rootNode.OuterXml);
Console.WriteLine(nodelist.Count); //Becomes 0
if (nodelist != null && nodelist.Count > 0)
{
foreach (XmlNode n in nodelist)
{
Console.WriteLine(n.OuterXml);
}
}
Console.ReadLine();
}
private static XmlNode RemoveChildren(XmlNode n) {
while (n.FirstChild != null)
{
n.RemoveChild(n.FirstChild);
}
return n;
}
}
Если я запущу этот код, мой список узлов станет равным 0. Почему список узлов становится равным 0, но почему я все еще могу получить доступ ко второму узлу?
Однако, если я добавлю цикл foreach сразу после doc.SelectNodes("//root/mxCell"); счет станет 4.
как это,
class Program
{
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Users\Username\Desktop\Diagram.xml");
XmlNode rootNode = doc.DocumentElement;
XmlNode secondNode = doc.SelectSingleNode(rootNode.Name + "/root");
XmlNodeList nodelist = doc.SelectNodes("//root/mxCell");
// Added code here
if (nodelist != null && nodelist.Count > 0)
{
foreach (XmlNode n in nodelist)
{
Console.WriteLine(n.OuterXml);
}
}
// End of added code
Console.WriteLine("-----------------------------------------");
Console.WriteLine(RemoveChildren(rootNode).OuterXml);
Console.WriteLine("-----------------------------------------");
Console.WriteLine(RemoveChildren(secondNode).OuterXml);
Console.WriteLine("-----------------------------------------");
//Console.WriteLine(rootNode.OuterXml);
Console.WriteLine(nodelist.Count); //Becomes 4
if (nodelist != null && nodelist.Count > 0)
{
foreach (XmlNode n in nodelist)
{
Console.WriteLine(n.OuterXml);
}
}
Console.ReadLine();
}
private static XmlNode RemoveChildren(XmlNode n) {
while (n.FirstChild != null)
{
n.RemoveChild(n.FirstChild);
}
return n;
}
}
Теперь счет 4.
Вот используемый xml:
<mxGraphModel dx="1086" dy="596" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="YJb7HCrh72y2aGPrfETQ-1" value="" style="endArrow=classic;html=1;" parent="1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="130" y="310" as="sourcePoint"/>
<mxPoint x="180" y="260" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="YJb7HCrh72y2aGPrfETQ-2" value="" style="endArrow=classic;html=1;" parent="1" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="290" y="270" as="sourcePoint"/>
<mxPoint x="340" y="220" as="targetPoint"/>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>