xml - VB.NET 从内联模式解析 XML 别名

标签 xml vb.net

我正在使用一个 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/

相关文章:

c# - JSON 序列化器和 CSLA 对象

vb.net - 文本框值范围 VB.NET

vb.net - 处理VB中的全局异常

python - View 架构的 XML 无效 - OpenErp

python - 如何使用 python lxml 获取 html 元素

android - 在软连字符处换行

vb.net - 恢复丢失的 VB.net 应用程序的方法

xml - 无法在 xml 中找到具有命名空间的元素

java - 未检测到给定文档的语法约束(DTD 或 XML 模式)

.net - ASP.NET 验证控件和 Javascript 确认框