Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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# 基于另一个xml属性的值使用XDocument获取xml属性_C#_Xml_Linq To Xml - Fatal编程技术网

C# 基于另一个xml属性的值使用XDocument获取xml属性

C# 基于另一个xml属性的值使用XDocument获取xml属性,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我有一些xml看起来像: <forms> <form name="admin" title="Admin Info"> <field name="primary" label="Primary Name" required="false"> <group desc="General" name="personalinfo" required="false" hide="false">

我有一些xml看起来像:

<forms>
    <form name="admin" title="Admin Info">
        <field name="primary" label="Primary Name" required="false">
        <group desc="General" name="personalinfo" required="false" hide="false">
            <field label="Photos" name="photoupload" required="false" hide="false">
            <field label="First Name" name="firstanme" required="false" hide="false">
        </group>
    </form>
    <form name = "..." etc>
        ....etc...
    </form>
</forms>
但是,我得到一个“
对象引用未设置为对象的实例。
”错误。我猜代码试图从第一个“field”标记(其中name=“primary”)获取信息,但实际上我想要从内部field标记获取信息,具体来说:

表单/表单(其中name=“admin”)/组(其中desc=“general”)/字段(其中name=“photoupload”)


我该怎么做呢?

只需使用强制转换,而不是读取
属性:

    var photoInfo = doc.Descendants("field")
                       .Where(field => (string)field.Attribute("name") == "photoupload")
                       .Select(field => new {
                                Hide = (bool?)field.Attribute("hide"),
                                Required = (bool?)field.Attribute("required")
                       })
                       .Single();
很可能是因为某些
字段
元素没有
名称
属性而出现异常。这意味着
field.Attribute(“name”)
将返回
null
。而
null.Value
将抛出
NullReferenceException
。请注意,某些元素也没有
hide
属性

当您将
XAttribute
XElement
强制转换为可以具有
null
值的类型时,如果属性或元素不存在,您将获得
null
。不会抛出任何异常

注意:因此,您只有一个名为的
字段
,您只需尝试获取该字段即可

var photoUpload = doc.Descendants("field")
                     .Single(f => (string)f.Attribute("name") == "photoupload");

// or
var photoUpload = doc.XPathSelectElement("//field[@name='photoupload']");

哇,谢谢你!在尝试你评论的第一部分时,我仍然遇到一些问题,比如使用演员阵容。但是,您是正确的,我需要的字段有一个唯一的名称,因此我可以使用您的方法直接获取它。然后我可以使用var isRequired=photoupload.Attribute(“必需”);谢谢@如果文档中可能没有具有给定名称的字段,则可以使用
SingleOrDefault
而不是
Single
,并在读取其他属性值之前检查结果是否为
null
var photoUpload = doc.Descendants("field")
                     .Single(f => (string)f.Attribute("name") == "photoupload");

// or
var photoUpload = doc.XPathSelectElement("//field[@name='photoupload']");