Преобразовать атрибуты XML в строку / список с точным значением XPATH (n) - PullRequest
0 голосов
/ 29 октября 2018
<root>
    <attribute code="AAA">
         <attribute code="A1"/>
         <attribute code="A1"/>
    </attribute>    
    <attribute code="AAA">
         <attribute code="A1"/>
    </attribute>
    <attribute code="AAA"/>
    <attribute code="BBB"/> 
</root>

Ожидаемый результат

/AAA[1]/A1[1]
/AAA[1]/A1[2]
/AAA[2]/A1[1]
/AAA[3]
/BBB[1]

Мой план состоял в том, чтобы построить их как / AAA / A1, а затем приступить к проверке дубликатов, но это неправильный подход и не будет правильно получен путь (n).

мой код до сих пор вызывает checkDown (XML):

        private void checkDown(XmlNode root)
        {
            if (root.HasChildNodes)
                checkDown(root.FirstChild);
            else
            {
                string str = "";
                checkUp(root, ref str);
                List1.Add(str);
            }
            if (root.NextSibling != null)            
                checkDown(root.NextSibling);
        }

        private void checkUp(XmlNode root, ref string str)
        {
            if (root.Attributes != null)
                if (root.Attributes["code"] != null)
                    str = "/" + root.Attributes["code"].Value.ToString() + str;

            if (root.ParentNode != null)
                checkUp(root.ParentNode, ref str);
        }

Надеюсь, я дал достаточно информации, я не знаю, какое "ключевое слово" искать. Благодаря.

1 Ответ

0 голосов
/ 29 октября 2018

Ну, как-то я подправил вышесказанное и придумал это ниже. Я не уверен, что это лучший способ. Публикуя это как ответ на мой вопрос, так как он сделал то, что я искал, но надеюсь, что есть несколько лучших способов сделать это.

        private void main()
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(@"C:\test.xml");
            XmlNode root = xDoc.SelectSingleNode("*");
            checkDown(root);            
        }
        private void checkDown(XmlNode root)
        {
            if (root.HasChildNodes)
                checkDown(root.FirstChild);
            else
            {
                string str = "";
                checkUp(root, ref str);
                List1.Add(str);
            }
            if (root.NextSibling != null)
                checkDown(root.NextSibling);
        }
        private void checkUp(XmlNode root, ref string str)
        {
            if (root.Attributes != null)
                if (root.Attributes["code"] != null)
                {
                    checkPrev(root, getAttribute(root));
                    if (counter > 0)
                    {
                        str = String.Concat("/", getAttribute(root), "[", (counter + 1).ToString(), "]") + str;
                        counter = 0;
                    }
                    else
                        str = "/" + root.Attributes["code"].Value.ToString() + str;
                }

            if (root.ParentNode != null)
                checkUp(root.ParentNode, ref str);
        }
        void checkPrev(XmlNode root, string stext)
        {
            if (root.PreviousSibling != null)
            {
                if (getAttribute(root.PreviousSibling) == stext)
                {
                    counter++;
                    checkPrev(root.PreviousSibling, stext);
                }
            }
        }
        private string getAttribute(XmlNode root)
        {
            if (root.Attributes != null)
                if (root.Attributes["code"] != null)
                    return root.Attributes["code"].Value.ToString();
            return null;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...