2016-01-27 2 views
1

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

Мой код в данный момент дает ошибку выражения, которая, как я полагаю, означает, что я получил неправильное выражение.

private String getPrivateID(String platformNo) 
{ 

    String platformTag = null; 

    try 
    { 
     InputStream is = getResources().openRawResource(R.raw.platform); 
     InputSource inputSrc = new InputSource(is); 

     XPath xpath = XPathFactory.newInstance().newXPath(); 

     String expression = String.format("//Platform[@PlatformNo=%s]/@PlatformTag", 
      platformNo); 
     NodeList nodes = (NodeList) xpath.evaluate(expression, 
      inputSrc, XPathConstants.NODESET); 

     platformTag = xpath.evaluate(expression, nodes); 

     return platformTag; 

    } 
    catch (Exception e) 
    { 
     return null; 
    } 
} 

Мой XML выглядит так:

<JPPlatforms> 
    <Platform PlatformTag="2980" PlatformNo="47280" Name="AGHS" 
     BearingToRoad="2.6606268e+002" RoadName="Avonside Dr"> 
    <Position Lat="-4.352447905000000e+001" Long="1.726611665000000e+002"/> 
    </Platform> 
    <Platform PlatformTag="1219" PlatformNo="28142" Name="Addington Village" 
     BearingToRoad="3.2193924e+002" RoadName="Lincoln Rd"> 
    <Position Lat="-4.354269524000000e+001" Long="1.726134222000000e+002"/> 
    </Platform> 
    <Platform PlatformTag="1220" PlatformNo="44108" Name="Addington Village" 
     BearingToRoad="1.4198888e+002" RoadName="Lincoln Rd"> 
    <Position Lat="-4.354386705000000e+001" Long="1.726111654000000e+002"/> 
    </Platform> 
    <Platform PlatformTag="2940" PlatformNo="45477" Name="Aidanfield Dr near Bibiana St" 
     BearingToRoad="2.1811232e+002" RoadName="Aidanfield Dr"> 
    <Position Lat="-4.356581921000000e+001" Long="1.725743414000000e+002"/> 
    </Platform> 
    <Platform PlatformTag="2941" PlatformNo="47192" Name="Aidanfield Dr near Bibiana St" 
     BearingToRoad="3.8112324e+001" RoadName="Aidanfield Dr"> 
    <Position Lat="-4.356595693000000e+001" Long="1.725742336000000e+002"/> 
    </Platform> 
<JPPlatforms> 

Где я не так? Заранее спасибо!

+0

Нету :(Тем не менее дает тот же XPathExpressionException – ForeverLearning

ответ

1

XPath

//Platform[@PlatformNo=%s]/@PlatformTag 

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

String platformTag = (String) xpath.evaluate(expression, inputSrc, XPathConstants.STRING); 

Вы можете также рассмотреть спасаясь число в кавычки:.

//Platform[@PlatformNo='%s']/@PlatformTag 
+0

Спасибо, что это было ! – ForeverLearning

+0

Кавычки по-прежнему являются хорошей идеей, например, если номер платформы 'platformNo'' foo bar baz'' передан, у вас снова появятся проблемы. – StuartLC

+0

Данные согласуются, но я обязательно использую ваши ценный совет, спасибо! – ForeverLearning