Archief - [C#] Xpath: hoe weet je wanneer parent is afgesloten?

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

G|N|

Legacy Member
Hallo,

Ik heb de volgende XML:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<Categories>
	<Category alphabet="A">
		<Verb name="GetApplicationForRefund">
			<Elements>
				<Element name="Dossier" type="int" paramType="in"/>
				<Element name="Product" type="int" paramType="in"/>
				<Element name="MessageBoxes" type="string" paramType="in"/>
				<ElementOrGroup>
					<Elements>
						<Element name="Version" type="int" paramType="out"/>
						<Element name="Succes" type="boolean" paramType="out"/>
						<Element name="IsReadOnly" type="boolean" paramType="out"/>
					</Elements>
					<Elements>
						<Element name="MessageBoxes" type="string" paramType="out"/>
						<Element name="Dossier" type="string" paramType="out"/>
					</Elements>
				</ElementOrGroup>
			</Elements>
		</Verb>
	</Category>
</Categories>

en dit is mijn c# code:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Collections;
using System.Xml.XPath;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private XmlDocument xmldocVerb = new XmlDocument();
        private XmlDocument xmldocStruct = new XmlDocument();
        private XmlDocument xmldocEnum = new XmlDocument();
        private StringReader readerVerb;
        private StringReader readerStruct;
        private StringReader readerEnum;
        private XPathDocument docVerb;
        private XPathDocument docStruct;
        private XPathDocument docEnum;
        private XPathNavigator navVerb;
        private XPathNavigator navStruct;
        private XPathNavigator navEnum;
        private ArrayList verbs = new ArrayList();
        private String verbDoc = "";
        private bool b = false;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            XPathDocument doc = new XPathDocument("C:\\testgroup.xml");
            XPathNavigator nav = ((IXPathNavigable)doc).CreateNavigator();
            XPathNodeIterator iter = nav.Select("/Categories/Category/Verb");
            
            while (iter.MoveNext())
            {
                textBox1.Text += iter.Current.Name + ": " + iter.Current.GetAttribute("name", "") + "\r\n";
                XPathNodeIterator newIter = iter.Current.SelectDescendants(XPathNodeType.Element, false);
                while (newIter.MoveNext())
                {
                    XPathNavigator tmp = null;
                    XPathNavigator tmp2 = null;

                         tmp = newIter.Current.SelectSingleNode("../../../ElementOrGroup");
                        if (tmp != null && b == false)
                        {

                            textBox1.Text += "(";
                            b = true;

                        }
                        if (b == true)
                        {
                            tmp2 = newIter.Current.SelectSingleNode("Element[last()]");

                            if (tmp2 != null && tmp2.ComparePosition(newIter.Current).ToString() == "After")
                            {
                                textBox1.Text += ") \r\n";
                                b = false;
                            }
                        }



                        textBox1.Text += newIter.Current.GetAttribute("name", "") + "\r\n";

                }
            }

        }
    }
}

Doe bedoeling is wanneer er <Elements> voorkomt met als parent <ElementOrGroup> een "(" te zetten en wanneer alle <Element> van de <Elements> zijn getoond een ")" te zetten.

De bedoeling is om de groupen te verdelen door ( element, element, element, )

Het eerste haakje werkt goed, maar het sluiten wilt maar niet lukken...
Hoe kan je in Xpath te weten komen dat we aan </Elements> zijn wanneer de parent van <Element> en <Elements> niet is veranderd?

Hopelijk is het duidelijk...
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan