Передача локального имени XML XElement в строку - PullRequest
0 голосов
/ 15 января 2020

Hy вообще, я новичок в C# программировании, так что, возможно, это простой вопрос. Я пытаюсь прочитать XML -файл с помощью XDocument и записать локальное имя элемента в виде строки.

Для вывода я использую окно листинга SiemensNX, но все остальные окна вывода или txt-файл подходит.

Вот входные данные - XML:

<?xml version="1.0" encoding="utf-8"?>

<Rootlvl>
    <Lvl_1>
        <Lvl_2/>
    </Lvl_1>
</Rootlvl>

Вот код C#:

using System.Xml.Linq;
using NXOpen;

namespace XmlElementName
{
    class Program
    {
        private static ListingWindow lw = s.ListingWindow;


        public static void Main()
        {
            string XmlFilePath = @"C:\Users\XXX\Desktop\TestXML.xml"; //XML path
            string testnode = "Lvl_2"; //local name of a optional XML element
            lw.Open(); //open NX listinwindow for output

            //=============LoadXmlFile================
            //get main Input
            XDocument xml = XDocument.Load(XmlFilePath); //load XmlFile



            //====================WriteOutElementName====================
            XElement node;
            if (testnode == null) //if no optional Element name --> take root element of XML
            {
                node = xml.Root;
            }
            else
            {
                // Find node to passed string "testnode" --> here "Lvl_2"
                node = xml.Element(testnode);
            }

            lw.WriteLine("Test"); //Test if output works --> !yes it works

            if(node != null)
            {
                string output = node.Name.LocalName;
                //local name of XElement-variable "node" to string

                lw.WriteLine(output); //output the local name of variable "node"
            }
            else
            {
               lw.WriteLine("Element with Name = " + testnode + "not found")
            }


        }
    }
}

Выходные данные, если переменная testnode = " Lvl_2 "должно быть:

Test
Lvl_2

Выходные данные, если переменная testnode = null, должны быть:

Test
Rootlvl

Отладчик VS показывает, что

node = xml.Element(testnode); //testnode = Lvl_2

может ' Найти в XML элемент с именем «Lvl_2». Таким образом, он устанавливает «узел» в «Нуль» и выбрасывает следующее исключение:

«System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта.»

Но я знаю, что » Lvl_2 "является подэлементом XML. Что я могу сделать, чтобы найти этот элемент "Lvl_2" в XML?

Что я должен изменить в этой строке

node = xml.Element(testnode)

, чтобы найти элемент по имени?

Спасибо за вашу помощь, ребята.

Ответы [ 3 ]

0 голосов
/ 15 января 2020

Согласно MSDN :

Метод XDocument.Element (XName) получает первое (в порядке документа) дочерний элемент с указанным XName.

Итак, в вашем случае

node = xml.Element(testnode)

возвращает null, если testnode = "Lvl_2", потому что Lvl_2 не является дочерний элемент документа xml (в этом контексте рассматривается только узел root Rootlvl в качестве дочернего элемента).

Попробуйте использовать Потомки метод вместо:

node = xml.Descendants(testnode).FirstOrDefault();
0 голосов
/ 15 января 2020

Спасибо @ jdweng,

Я принимаю следующие изменения. Теперь это работает.

using system.linq;

и замените

node.xml.Element(testnode);

на

node = xml.Descendents(testnode).FirstOrDefault();
0 голосов
/ 15 января 2020

Если вы поместили тестовый узел, которого нет в xml, тогда узел имеет значение null и это вызывает исключение, выполните проверку перед печатью

if (node!=null){
        string output = node.Name.LocalName;
        //local name of XElement-variable "node" to string

        lw.WriteLine(output); //output the local name of variable "node"
}
...