Саксонская 8 (Java версия) проблема - PullRequest
2 голосов
/ 11 мая 2009

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

По сути, я пытаюсь выполнить некоторую обработку xml в java, используя saxon v8. Для того, чтобы что-то заработало, я взял один из примеров файлов, включенных в пакет, и изменил его под свои нужды. Это работает, пока я не использую пространства имен, и это мой вопрос. Как я могу обойти проблему пространства имен? Я действительно не хочу использовать его, но он существует в моем XML, поэтому я должен либо использовать его, либо игнорировать его. Любое решение в порядке.

В любом случае, вот мой стартовый код. Он ничего не делает, но выполняет запрос xpath и пытается использовать его с жестко закодированным документом xml.

public static void main(String[] args) {
    String query = args[0];

    File XMLStream=null;
    String xmlFileName="doc.xml";
    OutputStream destStream=System.out;
    XQueryExpression exp=null;
    Configuration C=new Configuration();
    C.setSchemaValidation(false);
    C.setValidation(false);

    StaticQueryContext SQC=new StaticQueryContext(C);
    DynamicQueryContext DQC=new DynamicQueryContext(C);      
    QueryProcessor processor = new QueryProcessor(SQC);
    Properties props=new Properties();
    try{   
        exp=processor.compileQuery(query);
        XMLStream=new File(xmlFileName);
        InputSource XMLSource=new InputSource(XMLStream.toURI().toString());
        SAXSource SAXs=new SAXSource(XMLSource); 
        DocumentInfo DI=SQC.buildDocument(SAXs);
        DQC.setContextNode(DI);

        SequenceIterator iter = exp.iterator(DQC);
        while(true){
            Item i = iter.next();
            if(i != null){
                System.out.println(i.getStringValue());
            }
            else break;
        }
    }
    catch (Exception e){
        System.err.println(e.getMessage());
    }
}   

Пример XML-файла находится здесь ...

<?xml version="1.0"?>
<ns1:animal xmlns:ns1="http://my.catservice.org/">
    <cat>
        <catId>8889</catId>
        <fedStatus>true</fedStatus>
    </cat>
</ns1:animal>

Если я запускаю это с запросом, включающим пространство имен, я получаю сообщение об ошибке. Например: /ns1:animal/cat/ выдает ошибку: «Префикс ns1 не был объявлен».

Если я удалю ns1: из запроса, это ничего не даст мне. Если я лечу xml, чтобы удалить «ns1:» перед «животным», я могу успешно выполнить запрос /animal/cat/.

Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 2 ]

2 голосов
/ 11 мая 2009

Сообщение об ошибке правильно указывает, что ваше выражение xpath не указывает, что означает префикс пространства имен «ns1» (привязывается к). Тот факт, что для работы с документом используется привязка для «ns1», не означает, что это то, что следует использовать: это потому, что в XML важен URI пространства имен, а префиксы - это просто удобные ярлыки для реальной вещи.

Итак: как вы определяете привязку? Есть 2 общих способа; либо предоставьте контекст, который может разрешить префикс, либо вставьте фактический URI в выражение XPath.

Что касается первого подхода, в этом письме от саксонского автора упоминается метод JAXP XPath.setNamespaceContext (), аналогично, FAQ по процессору Jaxen XPath содержит пример кода, который может помочь Это не очень удобно, так как вам нужно реализовать NamespaceContext, но как только у вас будет реализация, вы будете установлены.

Итак, подход к обозначениям ... давайте посмотрим: Десять советов по использованию XPath и XPointer показывает этот пример:

для соответствия элемента, объявленного с пространством имен, например:

XMLNS: книга = "http://my.example.org/namespaces/book"

вы используете имя XPath, например:

{http://my.example.org/namespaces/book}section

что, надеюсь, поняли саксонцы (или джаксены).

Наконец, я бы порекомендовал перейти на Saxon9, если это возможно, если у вас возникли проблемы с использованием одного из вышеуказанных решений.

0 голосов
/ 23 января 2010

Если вы хотите, чтобы что-то работало из коробки, вы можете проверить embedding-xquery-in-java . Есть проект github, который использует Saxon для оценки некоторых примеров выражений XQuery.

Привет

...