Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果子元素不存在,则添加子元素_C#_Xml_Linq - Fatal编程技术网

C# 如果子元素不存在,则添加子元素

C# 如果子元素不存在,则添加子元素,c#,xml,linq,C#,Xml,Linq,关于如何做到这一点,我几乎没有什么解决方案,但我想知道是否有一种简洁的方法可以做到这一点 <Project> <Test> <Name value="zero"> <Name value="One"> <Name value="Two"> </Test> </Project> 有没有更好的办法?可能需要更简单的检查?您可能需要通过使用System.

关于如何做到这一点,我几乎没有什么解决方案,但我想知道是否有一种简洁的方法可以做到这一点

<Project>
    <Test>
        <Name value="zero">
        <Name value="One">
        <Name value="Two">
    </Test>
</Project>

有没有更好的办法?可能需要更简单的检查?

您可能需要通过
使用System.Xml.XPath使用XPath扩展为了避免冗长的LINQ,这非常简单

范例

    XElement element = testElement.XPathSelectElement("Name[@value='zero']");

    if (element == null)
    {
        testElement.add(newElement);
    }
在上面的示例中,XPath
Name[@value='zero']
表示您正在查找名为
Name
的元素,该元素的属性
@
名为
value
,值为
zero
。因此,问题中的linq被简化为单个
XPathSelectElement
,其余部分保持不变

可选,这只是对上述代码的重写

    if (testElement.XPathSelectElement("Name[@value='zero']") == null)
    {
        testElement.add(newElement);
    }

您正在将
XAttribute
与字符串进行比较,因此可能没有得到想要的结果

item.Attribute("value") == "zero"
尝试将其更改为:

(string)item.Attribute("value") == "zero"

这将在比较之前将属性转换为字符串。

如果xml无效,
Name
节点未关闭
testElement.Elements(“Name”).Any()
也可以。你想达到什么目的还不太清楚-如果不存在节点,你想添加节点吗?或者不存在具有确切属性的特定节点定义简洁的方法。L.B:我已经更新了这个问题。感谢您的关注。@user3606175您当前的代码是否正常工作,您是否正在寻求改进,或者您是否正在试图找出如何使其正常工作?目前它正常工作。我只是想也许我写了太多的代码,用简单的代码就可以实现。
(string)item.Attribute("value") == "zero"