0

大家好消息!我遇到了一些棘手的 xml 的新问题。

<?xml version="1.0" encoding="UTF-8"?>
<response>
<osmp_txn_id>100500</osmp_txn_id>
<result>0</result>
<fields>
<field1 name="name">Ko Chu Bey</field1>
<field2 name="contract">777-1</field2>
...
<fieldN name="account">65000</fieldN>
</fields>
<comment>Result for round 1 of fight vs Pe Re Svet: 1:1</comment>
</response>

我的问题是生成 xsd 的 ans cs 的内置实用程序为每个fieldX. 而且因为它们可能有N很多,所以在一个非常私密的地方会变得很痛苦。有没有办法将此 XML 中的对象反序列化为具有field对象数组的类?

4

2 回答 2

0

如果您在字符串中有 XML,您可以使用 Linq to XML 和名称的正则表达式来执行此操作:

var fieldElementNameRegex = new Regex(
    "^field[0-9]+$",
    RegexOptions.IgnoreCase | RegexOptions.Compiled);

var xml = XElement.Parse(xmlString);

var fieldElements = xml
    .Descendants()
    .Where(e => fieldElementNameRegex.IsMatch(e.Name.ToString()))
    .ToArray();
于 2013-04-09T11:58:10.547 回答
0

最好的解决方案是让您自己的IXmlSerializable实现来使用有问题的 xml。预先做会很麻烦,但从长远来看可能是值得的。

作为替代方案(我不会太强烈推荐它),您可以编写一个小技巧来反映默认序列化对象的属性 - 您解释的那个是由内置实用程序生成的。

例如,假设:

公共类字段 { 公共字符串名称;公共字符串值;}

public class response
{
  public Field field1;
  public Field field2;
  public Field field3;
  public Field field4;
  public Field field5;
  public Field field6;
  public Field field7;
  public string comments;
  public string osmp_txn_id;
  public string result;
}

您可以定义以下“便利”类:

public class myResponse
{
  public string comments;
  public string osmp_txn_id;
  public string result;
  public List<Field> fields;
}

这将是如何填充更方便的类:

myResponse ConvertFromResult(response target)
{
  var returnObject = new myResponse();

  var fields = target.GetType().GetFields().Where(f => f.FieldType == typeof(Field));
  returnObject.fields = (from f in fields
    let fp = f.GetValue(target) as Field
    where fp != null
    select fp).ToList();

  returnObject.comments = target.comments;
  returnObject.osmp_txn_id = target.osmp_txn_id;
  returnObject.result = target.result;

  return returnObject;
}

这都是概念性的,因此您可能需要从这里开始“推出自己的”解决方案。另一种选择是使用扩展方法IEnumerable<field>为 xml 反序列化对象返回一个,如果您打算以非性能密集型方式使用它,这将是可行的。

public static class responseExtensions
{
  private static IEnumerable<Field> GetFields(this response target)
  {
    var fields = target.GetType().GetFields().Where(f => f.FieldType == typeof(Field));
    return from f in fields
           let fp = f.GetValue(target) as Field
           where fp != null
           select fp;
  }
}
于 2013-04-09T13:51:55.257 回答