2014-01-23 12 views
0

обновление:получить значение XSI: noNamespaceSchemaLocation (XPATH)

Я хотел бы получить значение arritbute в XSI: noNamespaceSchemaLocation, то есть: "http://www.mypage/pagedescription.xsd"

<link 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="http://www.mypage/pagedescription.xsd"> 


... 
... 

ссылка является элементом в моей XML-файл (почти в самом верху)

Однако XPATH // п: ссылка/@ XSI: noNamespaceSchemaLocation не работает

Я попытался изменить контекст, но он по-прежнему не работает

@Override 
public Object executeXpathQuery(Document domDoc, String strQuery) throws Exception { 


    System.out.println("executeXpathQuery : strQuery:" + strQuery); 

    // output: executeXpathQuery: strQuery://n:link/@xsi:noNamespaceSchemaLocation 
    // so far, it looks OK 

    XPathFactory xpf = XPathFactory.newInstance(); 
    XPath xPath = xpf.newXPath(); 

    final String nonameNamespace = domDoc.getFirstChild().getNamespaceURI(); 

    NamespaceContext ctx = new NamespaceContext() { 
     public String getNamespaceURI(String prefix) { 

      String uri = null; 
      if ("n".equals(prefix)) { 
       System.out.println("using prefix"); 
       uri = nonameNamespace; 
      } 
      else if ("xsi".equals(prefix)) { 
       uri = "http://www.w3.org/2001/XMLSchema-instance"; 
      } 
      return null; 
     } 
     public String getPrefix(String uri) { 
      throw new UnsupportedOperationException(); 
     } 
     public Iterator getPrefixes(String uri) { 
      throw new UnsupportedOperationException(); 
     } 
    }; 


    xPath.setNamespaceContext(ctx); 

    XPathExpression xPathExp = xPath.compile(strQuery); 


    return (Node) xPathExp.evaluate(domDoc,XPathConstants.NODE); 

} 

И я сделал docuùent строитель осведомленный контекста:

static DocumentBuilder getDocumentBuilder() { 
    DocumentBuilderFactory dbf; 
    DocumentBuilder db; 

    db = null; 

    try { 
     dbf = DocumentBuilderFactory.newInstance(); 
     dbf.setNamespaceAware(true); 
     db = dbf.newDocumentBuilder(); 
    } catch (ParserConfigurationException e) { 
     LogMes.log(XMLFactoryServiceImpl.class, LogMes.ERROR, "Erreur lors de la cràation d'un document DOM. Message: " + e.getMessage()); 
    } 
    return db; 
} 

я «с помощью префикса» на выходе => эта часть lokks OK Я все еще получаю нулевое значение

Любые идеи?

ответ

2

Вы 99% пути там, вам просто нужно, чтобы сделать ваш NamespaceContext вернуть правильную вещь для xsi приставки:

public String getNamespaceURI(String prefix) { 

     String uri = null; 
     if ("n".equals(prefix)) { 
      System.out.println("using prefix"); 
      uri = nonameNamespace; 
     } else if ("xsi".equals(prefix)) { 
      uri = "http://www.w3.org/2001/XMLSchema-instance"; 
     } 
     return uri; 
    } 

Кроме того, если вы создаете domDoc путем разбора XML с использованием DocumentBuilder то вы должны убедиться, что строитель является областью имен, путем вызова docBuilderFactory.setNamespaceAware(true) до .newDocumentBuilder(). Для того, что я могу только предположить, являются историческими причинами, по умолчанию для DBF нужно разобрать без, обрабатывая пространства имен, и такое дерево DOM не будет работать с XPath.

+0

Я принял во внимание предложенные вами модификации, но у меня все еще есть нуль. Однако, большое спасибо за вашу доброту! – stackSaru

+0

@ user3166206 - это элемент 'link' сам в пространстве имен (т. Е. Существует ли элемент предка с объявлением' xmlns = "..." 'по умолчанию? Если это вам, вероятно, нужно «n: link» в XPath, а не просто «link». –

Смежные вопросы