2009-05-11 4 views
1

Теперь я укажу, что я новичок в использовании саксона, и я пробовал следовать документам и примерам в пакете, но мне просто не повезло с этим проблема.Проблема Saxon 8 (Java version)

В принципе, я пытаюсь выполнить некоторую обработку 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

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

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

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

Так нотация подход ... Давайте посмотрим: Top Ten Tips to Using XPath and XPointer показывает этот пример:

, чтобы соответствовать элемент объявленную с пространством имен, как:

Xmlns: книга = "http://my.example.org/ Пространства имен/книга»

использовать XPath имя как: раздел

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

, который мы надеемся, понимается Саксоном (или Яксеном).

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

0

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

С уважением