Как использовать SAX в этом XML-файле - PullRequest
4 голосов
/ 23 сентября 2011

У меня есть XML-файл, который я пытаюсь проанализировать с помощью Sax (это мой первый раз, когда я делаю это).Я исследовал, как реализовать синтаксический анализатор, и это все имеет смысл, но я не уверен, как лучше решить эту проблему.

Я разбросал фрагменты связанных данных (два факта связаныFactKey).В приведенном ниже примере Foo имеет значение 5,34.

Sax вызывает StartElement () для каждого нового элемента, так что это один вызов Facts и один вызов Value .... поэтому у меня следующие вопросы:Мне нужно сохранить FactKey из элемента Facts, чтобы я мог связать его с элементом Value на следующем проходе, или есть ли способ для Sax сделать это автоматически?

И есть ли встроенные средства для связываниядва разных факта с одним и тем же FactKey, возможно, если бы я использовал DOM вместо Sax?Или это просто желаемое за действительное, а мне просто нужно поддерживать мультикарту или что-то в этом роде.

 ...
    <Facts FactKey="2832154551" FieldId="73250">
    <Value xsi:type="xs:double">5.3499999</Value>
    </Facts>
    ...
    <Facts FactKey="2832154551" FieldId="410288">
    <Value xsi:type="xs:string">Foo</Value>
    </Facts>

Ответы [ 3 ]

3 голосов
/ 23 сентября 2011

Вы можете использовать SAX, чтобы делать такие вещи, но вы, вероятно, найдете это быстро утомительным. SAX - это базовый инструмент для построения блоков. Предполагая, что ваши документы имеют размер менее 20 МБ или около того, вам почти наверняка будет удобнее загружать весь документ в память и обрабатывать его с помощью более мощных инструментов. DOM тоже немного утомительно программировать, в основном потому, что его API плохо спроектирован, но имеет то преимущество, что вы можете запускать выражения XPath для него, эффективно позволяя вам найти все узлы с определенным значением ключа. Вы можете обнаружить, что другие древовидные API, такие как JDOM, XOM и DOM4J, вам больше по вкусу. Однако в конечном итоге вы, вероятно, захотите использовать более богатый язык программирования, такой как XSLT или xquery. XSLT имеет встроенную директиву «ключ», которая позволяет вам определять индекс для быстрого поиска элементов на основе ключей, подобных описанным вами, и предоставляет богатую среду программирования для обработки XML.

1 голос
/ 23 сентября 2011

По первому вопросу: да, вы должны поддерживать любой контекст, используемый синтаксическим анализатором (т. Е. Вы должны отслеживать тот факт, что вы находитесь в / не в элементе Facts).

Что касается связывания различных элементов Fact по ключу, да, с предостережениями.Вы можете загрузить файл в DOM (при условии, что у вас достаточно памяти), а затем использовать XPath для извлечения всех элементов с специфическим FactKey.

//Facts[@FactKey="2832154551"]

Однако, если вы хотите прочитатьфайл и накапливайте Facts с тем же ключом, тогда мультикарта - ваш лучший выбор.Анализатор DOM все еще может быть полезен, поскольку у вас может быть мультикарта, которая связывает строковые ключи со значениями Element.

0 голосов
/ 23 сентября 2011

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

...