Разбор XML.Net с необязательными внутренними (под) тегами, я делаю это правильно?
Доставка - это особенность, и это работает... но у меня очень сильное чувство, что есть гораздо более простой способ сделать это, что позволит мне делать подобные вещи в будущем намного легче, поэтому я здесь...
Я читаю файл общих строк Excel, который выглядит следующим образом...
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="61" uniqueCount="60">
<si><t>Value</t></si><si><t>Notes</t></si>
<si><r><t xml:space="preserve">Time </t></r><r><rPr><b/><sz val="9"/><color theme="1"/><rFont val="Arial"/><family val="2"/></rPr><t>(Do not change!)</t></r></si>
<si><t>Date</t></si>
Мне нужны только "внутренние" строки, "Время", "Дата" и т. Д. Я написал код, чтобы сделать это, ища <t>
теги и читая их Value
в массив строк. Этот конкретный файл, однако, имеет две строки в одной ячейке, в Time, который интерпретируется как две разные строки и идет в два слота - плохо.
Поэтому я переписал код, чтобы найти си вместо...
RD = New XmlTextReader(New StringReader(SBXMLData.Trim()))
I = -1
Do While RD.Read()
If RD.NodeType = XmlNodeType.Element AndAlso RD.LocalName = "si" Then
'this is a cell for a string, so to start with we want to increment the index
I += 1
While RD.Read()
If RD.NodeType = XmlNodeType.EndElement AndAlso RD.LocalName = "si" Then
Exit While
End If
If RD.NodeType = XmlNodeType.Element AndAlso RD.LocalName = "t" Then
RD.Read()
If Strings.ContainsKey(I) Then
Strings(I) += RD.Value
Else
Strings.Add(I, RD.Value)
End If
End If
End While
End If
Loop
Это работает, но, кажется, должен быть более простой способ сделать это. Я предполагаю, что мой вопрос "как мне получить все значения из пути"si.t", независимо от того, есть ли r
или же font
или что-то еще между ними.
Я подозреваю, что Linq может иметь поддержку для этого, но наша платформа 3.51, так что это не так. И Xamarin является целью (иногда) тоже. Я знаю, что есть сторонние парсеры, которые будут делать это, но они могут быть не переносимыми. Так есть ли каноническое решение этой проблемы в базовом.Net, которое мне нужно использовать?