我有一个女巫项目,我必须抓取一个给定的网站,并在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
,但我不知道从哪里开始,我很难理解它是如何工作的。
答案 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())
});