/ / VB.NET Разрешаване на псевдоними на XML от вградена схема - xml, vb.net

VB.NET Разрешаване на XML псевдоними от вградена схема - xml, vb.net

Консумирам уеб услуга, която предоставя XMLданни с вградена схема. Изглежда XML изход от Microsoft ADO. Схемата съдържа пълните имена на атрибути, докато самите данни съдържат само псевдоними.

Примерен 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 вместо?

Отговори:

2 за отговор № 1

С риск да заявите очевидното - и като aвзрив от миналото за мен :) - тъй като това е действителен набор от записи 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);

0 за отговор № 2

Можете ли да получите достъп до схемата програмно? Тоест, прочетете го, както бихте искали всяка друга част от XML документа?

Прочетох в схемата и изградих Dictionary<string, string> за да картографирате имената на полета (FIRSTNAME и т.н.) към маркерите (C4-C12) и търсите името на маркера по име на полето.

Моят VB е ръждясал, но бих могъл да ви дам някакъв примерен код в C #, ако желаете.


0 за отговор № 3

Можете да получите името на атрибута за FIRSTNAME така:

Dim firstNameAttributeName As String = (
From attr
In doc...<s:AttributeType>
Where attr.@rs:name = "FIRSTNAME"
Select attr.@name
).First()

(Където doc е твой XDocument обект) След това можете да получите стойността на този атрибут за всеки даден елемент като този:

Dim personName As String = person.Attribute(firstNameAttributeName).Value

(Където person е XElement обект) Това, очевидно, изисква следното Imports:

Imports <xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882">
Imports <xmlns:rs="urn:schemas-microsoft-com:rowset">
Imports <xmlns:z="#RowsetSchema">