Добавление ссылки на пространство имен XML в vb.net - PullRequest
0 голосов
/ 24 января 2011

Я пишу программный продукт, который принимает XML от наших клиентов. У xml есть 2 части, стандартная часть, которая содержит поля набора, и часть свободной формы, которая позволяет нашим клиентам добавлять свои собственные xml

<OverallDocument>
    <SetFields>
        <name>Jon Doe</name>
        <age>24</age>
        <sex>M</sex>
    </SetFields>
    <FreeXML>
    <!--custom xml goes here-->
    </FreeXML>
</OverallDocument>

Система настроена таким образом, что у TotalDocument есть схема, которая охватывает все разделы xml, кроме того, что входит в теги FreeXML. Содержимое тегов FreeXML имеет собственную схему, отправленную нам нашим клиентом.

<OverallDocument>
    <SetFields>
        <name>Jane Doe</name>
        <age>30</age>
        <sex>F</sex>
    </SetFields>
    <FreeXML>
    <Custom1>
        <CustomString>aaaaaa</CustomString>
        <CustomInt>12345</CustomInt>
    </Custom1>
    </FreeXML>
</OverallDocument>

В этом случае xml клиента выглядит так

<Custom1>
    <CustomString>aaaaaa</CustomString>
    <CustomInt>12345</CustomInt>
</Custom1>

Программа пытается извлечь клиентский XML-файл для дальнейшей обработки.

Пока проблем нет. все это хорошо читается в xmldocument. К сожалению, некоторые из наших клиентов используют префиксы пространства имен в своих пользовательских xml, не объявляя префиксы в документе xml.

<OverallDocument>
    <SetFields>
        <name>Jane Doe</name>
        <age>30</age>
        <sex>F</sex>
    </SetFields>
    <FreeXML>
    <hl:Custom1>
        <CustomString>aaaaaa</CustomString>
        <CustomInt>12345</CustomInt>
    </hl:Custom1>
    </FreeXML>
</OverallDocument>

Это приводит к падению xmldocument, так как префиксы не объявлены в xml. Я попытался обойти это путем удаления всех префиксов пространства имен из кода, но это вызывает проблемы позже при обработке, поскольку схемы клиентов требуют, чтобы префиксы были в тегах.

некоторые дальнейшие проблемы

  • У нас много клиентов с разными схемы и разные пространства имен.
  • Каждый XML-файл может иметь несколько Элементы FreeXML в разных разделы (поэтому невозможно просто извлеките раздел FreeXML как разные клиенты используют 1 или более и использовать разделы в разных местах по всему документу.
  • Мы не можем редактировать схему клиентов.
  • Мы не можем сказать клиентам сортировать их разыгрывают и пишут рабочие xml.

В идеале было бы лучше, если бы мы могли просто указать пространство имен и префикс для читателя xmldocument. например,

dim xdoc as xmldocument = xmldocument
'add namespace and prefix
xdoc.loadxml(xmlcode)

1 Ответ

0 голосов
/ 24 января 2011

Кажется, способ исправить это - изменить способ загрузки xml в xmldocument. Тогда как раньше я разбирал строку в методе loadxml xmldocument. Теперь я анализирую строку в считывателе строк, а затем анализирую ее в xmltextreader. Xmltextreader имеет свойство Namespaces, которое позволяет отключить проверку пространства имен. Затем xmltextreader можно проанализировать в методе загрузки xmldocument.

Dim xstring As String = xmldata
Dim sreader As New System.IO.StringReader(xstring) 'load string into stringreader
Dim xreader As New XmlTextReader(sreader)          'load stringreader into xmltextreader
xreader.Namespaces = False                         'turn off namespaces
Dim xdoc As XmlDocument = New XmlDocument          'create xmldocument
xdoc.Load(xreader)                                 'Load xmltextreader into xmldocument
...