Разбор 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, которое мне нужно использовать?

0 ответов

Другие вопросы по тегам