从Ruby世界回来后,我期望在C#中也能看到类似的XML-to-hash映射工具。
以下是源XML:
<whois-resources xmlns:xlink="http://www.w3.org/1999/xlink">
<service name="search"/>
<parameters>
<inverse-lookup/>
<type-filters/>
<flags/>
<query-strings>
<query-string value="....."/>
</query-strings>
<sources/>
</parameters>
<objects>
<object type="inetnum">
<link xlink:type="locator" xlink:href="http://rest.db.ripe.net/ripe/inetnum/....."/>
<source id="ripe"/>
<primary-key>
<attribute name="inetnum" value="....."/>
</primary-key>
<attributes>
<attribute name="inetnum" value="....."/>
<attribute name="netname" value="....."/>
<attribute name="descr" value="....."/>
<attribute name="descr" value="....."/>
<attribute name="country" value="....."/>
<attribute name="admin-c" value="....." referenced-type="person">
<link xlink:type="locator" xlink:href="http://rest.db.ripe.net/ripe/person/....."/>
</attribute>
<attribute name="tech-c" value="....." referenced-type="person">
<link xlink:type="locator" xlink:href="http://rest.db.ripe.net/ripe/person/....."/>
</attribute>
<attribute name="status" value="ASSIGNED PA"/>
<attribute name="mnt-by" value="....." referenced-type="mntner">
<link xlink:type="locator" xlink:href="http://rest.db.ripe.net/ripe/mntner/....."/>
</attribute>
<attribute name="remarks" value="....."/>
<attribute name="remarks" value="....."/>
<attribute name="remarks" value="....."/>
<attribute name="source" value="....." comment="Filtered"/>
</attributes>
<tags>
<tag id="RIPE-USER-RESOURCE"/>
</tags>
</object>
<object type="person">
<link xlink:type="locator" xlink:href="http://rest.db.ripe.net/ripe/person/....."/>
<source id="ripe"/>
<primary-key>
<attribute name="nic-hdl" value="....."/>
</primary-key>
<attributes>
<attribute name="person" value="....."/>
<attribute name="address" value="....."/>
<attribute name="address" value="....."/>
<attribute name="address" value="....."/>
<attribute name="phone" value="....."/>
<attribute name="fax-no" value="....."/>
<attribute name="nic-hdl" value="....."/>
<attribute name="mnt-by" value="....." referenced-type="mntner">
<link xlink:type="locator" xlink:href="http://rest.db.ripe.net/ripe/mntner/....."/>
</attribute>
<attribute name="remarks" value="....."/>
<attribute name="remarks" value="....."/>
<attribute name="remarks" value="....."/>
<attribute name="remarks" value="....."/>
<attribute name="source" value="....." comment="Filtered"/>
</attributes>
</object>
<object type="route">
<link xlink:type="locator" xlink:href="http://rest.db.ripe.net/ripe/route/....."/>
<source id="ripe"/>
<primary-key>
<attribute name="route" value="....."/>
<attribute name="origin" value="....."/>
</primary-key>
<attributes>
<attribute name="route" value="....."/>
<attribute name="descr" value="....."/>
<attribute name="origin" value="....." referenced-type="aut-num">
<link xlink:type="locator" xlink:href="http://rest.db.ripe.net/ripe/aut-num/....."/>
</attribute>
<attribute name="remarks" value="....."/>
<attribute name="remarks" value="....."/>
<attribute name="remarks" value="....."/>
<attribute name="remarks" value="....."/>
<attribute name="mnt-by" value="....." referenced-type="mntner">
<link xlink:type="locator" xlink:href="http://rest.db.ripe.net/ripe/mntner/....."/>
</attribute>
<attribute name="source" value="....." comment="Filtered"/>
</attributes>
</object>
</objects>
<terms-and-conditions xlink:type="locator" xlink:href="http://www.ripe.net/db/support/db-terms-conditions.pdf"/>
</whois-resources>
我希望您能将其重新映射为具有以下结构的对象:
{
Service: {
Name: "....."
},
Parameters: {
QueryStrings: [".....", "....."]
},
Inetnum: {
Link: {
Type: ".....",
Href: "....."
},
Source: {
id: "....."
},
PrimaryKey: {
Inetnum: "....."
},
Attr: {
Inetnum: ".....",
Netname: ".....",
Descr: ".....",
Country: ".....",
AdminC: {
Value: ".....",
ReferencedType: ".....",
Link: {
Type: ".....",
Href: "....."
}
},
TechC: {
Value: ".....",
ReferencedType: ".....",
Link: {
Type: ".....",
Href: "....."
}
},
Status: ".....",
MntBy: {
Value: ".....",
ReferencedType: ".....",
Link: {
Type: ".....",
Href: "....."
}
}
Remarks: ".....", #a concatenation of all remarks nodes
Source: {
Value: ".....",
Comment: "....."
}
},
Tags: [
{ id: "....." }
]
},
Person {
Link: {
Type: ".....",
Href: "....."
},
Source: {
id: "....."
}
PrimaryKey: {
NicHdl: "....."
},
Attr: {
Person: ".....",
Address: ".....", #a concatenation of all address nodes
Phone: ".....",
FaxNo: ".....",
NicHdl: ".....",
MntBy: {
Value: ".....",
ReferencedType: ".....",
Link: {
Type: ".....",
Href: "....."
}
}
Remarks: ".....", #a concatenation of all remarks nodes
Source: {
Value: ".....",
Comment: "....."
}
}
},
Route: {
Link: {
Type: ".....",
Href: "....."
},
Source: {
id: "....."
},
PrimaryKey: {
Route: ".....",
Origin: "....."
},
Attr: {
Route: ".....",
Descr: ".....",
Origin: {
Value: ".....",
ReferencedType: ".....",
Link: {
Type: ".....",
Href: "....."
}
},
Remarks: ".....", #a concatenation of all remarks nodes
MntBy: {
Value: ".....",
ReferencedType: ".....",
Link: {
Type: ".....",
Href: "....."
}
},
Source: {
Value: ".....",
Comment: "....."
}
}
},
TermsAndConditions: {
Type: ".....",
Href: "....."
}
}
为了能够调用属性,例如:
whois.Inetnum.Attr.Netname
我完全不喜欢通过调用
SelectSingleNode("xpath");
来检索每个节点的想法。期望的流程是:
- 定义接收器对象及其所有子对象
- 定义映射规则
- 使用单个方法调用解析XML字符串
XmlSerializer
进行反序列化呢? - dbc