【问题标题】:Transfer the local name of a XML XElement to string将 XML XElement 的本地名称传输到字符串
【发布时间】:2020-01-15 13:08:04
【问题描述】:

嘿嘿, 我是 C# 编程的新手,所以也许这是一个简单的问题。 我尝试使用 XDocument 读取 XML 文件并将元素的本地名称写为字符串。

对于输出,我使用 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”的元素。所以它将“node”设置为“Null”并抛出以下异常:

“System.NullReferenceException:对象引用未设置为对象的实例。”

但我知道“Lvl_2”是 XML 的子元素。我该怎么做才能在 XML 中找到这个元素“Lvl_2”?

我应该在这一行中改变什么

node = xml.Element(testnode)

按名称查找元素?

感谢你们的帮助。

【问题讨论】:

标签: c# xml string xelement


【解决方案1】:

根据MSDN

方法 XDocument.Element(XName) 获得第一个(按文档顺序) 具有指定 XName 的 child 元素。

所以,在你的情况下,

node = xml.Element(testnode)

如果testnode = "Lvl_2"返回null,因为Lvl_2不是xml文档的子元素(只有根节点Rootlvl被认为是子元素就是这个上下文)。

尝试改用Descendants 方法:

node = xml.Descendants(testnode).FirstOrDefault();

【讨论】:

  • 是的,谢谢,我找到了与 jdweng 方法相同的解决方案。但是您的回答很好地解释了为什么我的第一种方法是错误的。
【解决方案2】:

如果您放置了一个在 xml 中不存在的 testnode,则 node 为 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"
}

【讨论】:

  • 感谢您的回答。我添加了您的解决方案,但它并没有回答整个问题。我编辑问题以指定它。
【解决方案3】:

谢谢@jdweng,

我进行了以下更改。现在可以了。

using system.linq;

替换

node.xml.Element(testnode);

node = xml.Descendents(testnode).FirstOrDefault();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2015-01-20
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多