Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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# LINQ XML-从XElement检索未知名称和值_C#_Xml_Linq_Xsd - Fatal编程技术网

C# LINQ XML-从XElement检索未知名称和值

C# LINQ XML-从XElement检索未知名称和值,c#,xml,linq,xsd,C#,Xml,Linq,Xsd,我目前正在努力解析以下XML/XSD 我的XSD中有一个“字段”列表,该列表必须是以下内容之一: <xs:element name="Field"> <xs:annotation> <xs:documentation>Element to describe a selection by specified field values (decoded values).</xs:documentation> </x

我目前正在努力解析以下XML/XSD

我的XSD中有一个“字段”列表,该列表必须是以下内容之一:

<xs:element name="Field">
    <xs:annotation>
        <xs:documentation>Element to describe a selection by specified field values (decoded values).</xs:documentation>
    </xs:annotation>
    <xs:complexType>
        <xs:attribute name="subsystem_ident" type="xs:string" />
        <xs:attribute name="failure_type" type="xs:string" />
        <xs:attribute name="failure_type_code" type="xs:unsignedShort" />
        <!-- list continues -->
    </xs:complexType>
</xs:element>
有人能帮我填补XML解析方法的空白吗

//
    Include = RetrieveFields(matchExpElement.Elements("Match").Elements("Include").Elements("Field")),
//

private List<Field> RetrieveFields(IEnumerable<XElement> fieldElements)
{          
    var fields = from x in fieldElements
                 select new Field()
                 {
                     Name = 
                     Type = 
                     Value = 
                 };

     return fields.ToList();
}
//
Include=RetrieveFields(matchExpElement.Elements(“Match”).Elements(“Include”).Elements(“Field”),
//
私有列表检索字段(IEnumerable fieldElements)
{          
变量字段=从字段元素中的x开始
选择新字段()
{
姓名=
类型=
值=
};
返回字段。ToList();
}

为了获得属性的模式类型信息,首先需要针对模式,让它构建模式验证后信息集(验证方法的最后一个参数)

我在LINQPad中得到以下结果:


XML应该如何映射到您的类中?对于示例XML,您希望在
名称
类型
中有什么内容?@Mark-名称应该是字段名,例如“failure\u Type”。值应该是值,例如“Blah”,类型应该是xsd中指定的类型-在本例中,它是一个字符串。前者比后者容易,我可以在LINQ之外解析它们,但我更喜欢一个更一致的解决方案。谢谢。我不知道你可以使用模式像那样进入它,这非常有用!
 <Include>
   <Field failure_type="Blah" />
   <Field failure_type_id="2" />
 </Include>
public string Name { get; set; } // Should ultimately be an enum.
public Type Type { get; set; }
public string Value { get; set; }
//
    Include = RetrieveFields(matchExpElement.Elements("Match").Elements("Include").Elements("Field")),
//

private List<Field> RetrieveFields(IEnumerable<XElement> fieldElements)
{          
    var fields = from x in fieldElements
                 select new Field()
                 {
                     Name = 
                     Type = 
                     Value = 
                 };

     return fields.ToList();
}
var schemas = new XmlSchemaSet();
schemas.Add("", @"C:\Path\To\Your\schema.xsd");
var xml = @"
    <Match>
        <Include>
            <Field failure_type='Blah' />
            <Field failure_type_code='2' />
        </Include>
    </Match>
";
var doc = XDocument.Parse(xml);
doc.Validate(schemas, (s, e) => { Console.WriteLine(e); }, true);
var fields =
    from f in doc.Elements("Match").Elements("Include").Elements("Field")
    let attr = f.Attributes().First()
    select new Field() {
        Name = attr.Name.LocalName,
        Type = attr.GetSchemaInfo()
                .SchemaAttribute.AttributeSchemaType.Datatype.ValueType,
        Value = attr.Value
    };