C# LINQ XML-从XElement检索未知名称和值
我目前正在努力解析以下XML/XSD 我的XSD中有一个“字段”列表,该列表必须是以下内容之一: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
<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
};