在运行时使用序列化更改Xml属性名称

时间:2015-03-27 08:49:06

标签: c# xml datacontract

我有一个女巫项目,我必须抓取一个给定的网站,并在Xml文件中获取用户指定的一些请求内容。

配置文件属于此类型。这里举例说明我放了两个条目,但它可以有1个或2000个。

<root>
    <item>
         <xpath>//meta[@name="description"]</xpath>
         <name>Description></name>
    </item>
    <item>
         <xpath>//meta[@http-equiv="Content-Language"]</xpath>
         <name>Language</name>
    </item>
</root>

序列化的database.xml属于这种类型:

   <itemCollection>
        <item>
            <Foo>somedata</foo>
            <bar>otherdata</bar>
            <RequestedData>
                  <SpecialData>Data asked by user</specialData>
                  <SpecialDatal>Other data asked by user</specialData>
            </RequestedData>
         </item>
    </itemCollection>

我需要什么(来自示例配置文件):

...
  <RequestedData>
    <Description>Some description</Description>
    <Language>Some language</Language>
  </RequestedData>
...

我需要使用配置文件的Name值命名SpecialData属性。换句话说,我需要动态地并在运行时更改节点的属性名称

由于我必须使用XmlSerializer,这是一个很大的问题。

配置文件在具有List<string>的对象中反序列化。

public class RequestedData
{
    public string RequestedXpath { get; set; }
    public string RequestedName { get; set; }
}

public class ExtractDataOptions : List<RequestedData>
{
    public List<RequestedData> RequestedData;

    public ExtractDataOptions()
    {
    }
}

我查看了互联网,我认为我的问题的解决方案是使用[DataContract]DataCollection,但我不知道从哪里开始,我很难理解它是如何工作的。

1 个答案:

答案 0 :(得分:0)

如果您要尝试将XML映射到类,请使用XmlSerializer,而不是DataContractSerializer。

或者,只需使用XDocument解析XML并使用LINQ to XML拉出所需的位:

string config = @"

        <root>
            <item>
                <xpath>//meta[@name=""description""]</xpath>
                <name>Description</name>
            </item>
            <item>
                <xpath>//meta[@http-equiv=""Content-Language""]</xpath>
                <name>Language</name>
            </item>
        </root>                                             

        ";

var data = XDocument.Parse(config)
                    .Descendants("item")
                    .Select(x => new RequestedData()
                    {
                        RequestedXpath = (string)(x.Descendants("xpath").First()),
                        RequestedName  = (string)(x.Descendants("name").First())
                    });