我正在使用一个 Web 服务,该服务提供带有内联架构的 XML 数据。它看起来像 Microsoft ADO 的 XML 输出。架构包含完整的属性名称,而数据本身仅包含别名。
示例 XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
<s:ElementType name="row" content="eltOnly">
<s:AttributeType name="c4" rs:name="FULLNAME" rs:number="5" />
<s:AttributeType name="c5" rs:name="FIRSTNAME" rs:number="6" />
<s:AttributeType name="c6" rs:name="MIDDLENAME" rs:number="7" />
<s:AttributeType name="c7" rs:name="LASTNAME" rs:number="8" />
<s:AttributeType name="c8" rs:name="ADDRESSLINE1" rs:number="9" />
<s:AttributeType name="c9" rs:name="ADDRESSLINE2" rs:number="10" />
<s:AttributeType name="c10" rs:name="CITY" rs:number="11" />
<s:AttributeType name="c11" rs:name="POSTALCODE" rs:number="12" />
<s:AttributeType name="c12" rs:name="STATE" rs:number="13" />
</s:ElementType>
</s:Schema>
<rs:data>
<z:row c4="Jane Frickin Doe"
c5="Jane"
c6="Frickin"
c7="Doe"
c8="1234 Fifth Ave"
c9=""
c10="Anywhere"
c11="98765"
c12="US"/>
</rs:data>
</xml>
我可以将其放入 XDocument 中,并使用以下方法迭代记录:
For Each person In personRecs...<z:row>
Dim firstName as String = person.@c5
Next
但是,这会带来问题,因为随着添加或删除字段,字段顺序可能会任意更改(如果在其之前添加了另一个字段,则名字可能是 @c6。)那么我如何使用 person.@FIRSTNAME
而是?
最佳答案
冒着陈述明显事实的风险——对我来说是过去的一次爆炸:)——因为它是一个实际的 ADO 记录集 xml,所以您可以将其插入 ADO 记录集,并且您肯定会拥有命名字段访问权限.
您需要在项目中引用.net“ADODB”。 然后你可以得到如下:
string strInputXML;
strInputXML = string.Concat(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>",
"<xml xmlns:s=\"uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882\" ",
"xmlns:dt=\"uuid:C2F41010-65B3-11d1-A29F-00AA00C14882\" ",
"xmlns:rs=\"urn:schemas-microsoft-com:rowset\" ",
"xmlns:z=\"#RowsetSchema\">",
"<s:Schema id=\"RowsetSchema\">",
" <s:ElementType name=\"row\" content=\"eltOnly\">",
" <s:AttributeType name=\"c4\" rs:name=\"FULLNAME\" rs:number=\"5\" />",
" <s:AttributeType name=\"c5\" rs:name=\"FIRSTNAME\" rs:number=\"6\" />",
" <s:AttributeType name=\"c6\" rs:name=\"MIDDLENAME\" rs:number=\"7\" />",
" <s:AttributeType name=\"c7\" rs:name=\"LASTNAME\" rs:number=\"8\" />",
" <s:AttributeType name=\"c8\" rs:name=\"ADDRESSLINE1\" rs:number=\"9\" />",
" <s:AttributeType name=\"c9\" rs:name=\"ADDRESSLINE2\" rs:number=\"10\" />",
" <s:AttributeType name=\"c10\" rs:name=\"CITY\" rs:number=\"11\" />",
" <s:AttributeType name=\"c11\" rs:name=\"POSTALCODE\" rs:number=\"12\" />",
" <s:AttributeType name=\"c12\" rs:name=\"STATE\" rs:number=\"13\" />",
" </s:ElementType>",
"</s:Schema>",
"<rs:data>",
"<z:row c4=\"Jane Frickin Doe\"",
" c5=\"Jane\"",
" c6=\"Frickin\"",
" c7=\"Doe\"",
" c8=\"1234 Fifth Ave\"",
" c9=\"\"",
" c10=\"Anywhere\"",
" c11=\"98765\"",
" c12=\"US\"/>",
"</rs:data>",
"</xml>"
);
//--- interestingly, you have to drop the xml declaration
// I'll be lazy and cut it as a string for this example
strInputXML = strInputXML.Replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "");
//--- And we can load an actual ADODB.recordset with it, for named field access
ADODB.Stream objADOStream = new ADODB.Stream();
objADOStream.Open();
objADOStream.WriteText(strInputXML);
objADOStream.Position = 0;
ADODB.Recordset objRS = new ADODB.Recordset();
objRS.Open(objADOStream);
Console.WriteLine (objRS.Fields["FULLNAME"].Value);
关于xml - VB.NET 从内联模式解析 XML 别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21006168/