XML разбора строк документа имеет 0, когда он должен иметь большее значение - PullRequest
0 голосов
/ 12 марта 2020

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

String theReturnedResult = convertStreamToString(connection.getInputStream());
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;

try {
    builder = builderFactory.newDocumentBuilder();
    Document xmlDocument = builder.parse(new ByteArrayInputStream(theReturnedResult.getBytes()));

    XPath xpath = XPathFactory.newInstance().newXPath();
    String xpathExpression = "jp06:members/jp06:role-assignments/jp06:role-assignment/jp06:url";
    NodeList nodes = (NodeList) xpath.evaluate(xpathExpression, xmlDocument, XPathConstants.NODESET);
    //Document xmlDocument = builder.parse(new ByteArrayInputStream(theReturnedResult.getBytes()));

    System.out.print(nodes.getLength());

    for (int i = 0; i < nodes.getLength(); i++) {..........

Сам XML выглядит так:

<?xml version="1.0" encoding="UTF-8"?><jp06:members xmlns:jp06="http://jazz.net/xmlns/prod/jazz/process/0.6/" xmlns:jp="http://jazz.net/xmlns/prod/jazz/process/1.0/" jp:total-members="68">
    <jp06:member>
        <jp06:url>https://zzzzz.zzzzz.zz:9443/qm/process/project-areas/_rutRzzzzzzzzzzzzzzzzz/members/Bob</jp06:url>
        <jp06:user-url>https://zzzzz.zzzzz.zz:9443/jts/users/Bob</jp06:user-url>
        <jp06:role-assignments-url>https://zzzzz.zzzzz.zz:9443/qm/process/project-areas/_rutRzzzzzzzzzzzzzzzzz/members/Bob/role-assignments</jp06:role-assignments-url>
        <jp06:role-assignments>
            <jp06:role-assignment>
                <jp06:url>https://zzzzz.zzzzz.zz:9443/qm/process/project-areas/_rutRzzzzzzzzzzzzzzzzz/members/Bob/role-assignments/tester</jp06:url>
                <jp06:role-url>https://zzzzz.zzzzz.zz:9443/qm/process/project-areas/_rutRzzzzzzzzzzzzzzzzz/roles/tester</jp06:role-url>
            </jp06:role-assignment>
            <jp06:role-assignment>
                <jp06:url>https://zzzzz.zzzzz.zz:9443/qm/process/project-areas/_rutRzzzzzzzzzzzzzzzzz/members/Bob/role-assignments/default</jp06:url>
                <jp06:role-url>https://zzzzz.zzzzz.zz:9443/qm/process/project-areas/_rutRzzzzzzzzzzzzzzzzz/roles/default</jp06:role-url>
            </jp06:role-assignment>
        </jp06:role-assignments>
        <jp06:role-assignments-editor-url>https://zzzzz.zzzzz.zz:9443/qm/_ajax-modules/com.ibm.team.process.manageProcessRolesAssignmentWidget?memberUrl=https://zzzzz.zzzzz.zz:9443/qm/process/project-areas/_rutRzzzzzzzzzzzzzzzzz/members/Bob&amp;rolesUrl=https://zzzzz.zzzzz.zz:9443/qm/process/project-areas/_rutRzzzzzzzzzzzzzzzzz/roles</jp06:role-assignments-editor-url>
    </jp06:member>
    <jp06:member>.......

Проблема в том, что я ничего не получаю за:

документ [#document: null]

xmlDocument [#document: null]

Переменная theReturnedResult содержит все XML внутри нее, поэтому я не уверен, почему Document и xmlDocument равны null ?

1 Ответ

0 голосов
/ 13 марта 2020

Кажется, ваш XPath ничего не возвращает. Не могли бы вы попробовать с (удалить s из jp06: members):

//jp06:member/jp06:role-assignments/jp06:role-assignment/jp06:url

Или кратчайшей формы:

//jp06:role-assignment/jp06:url

РЕДАКТИРОВАТЬ: Вы можете попытаться выполнить это локально (установите путь к ваш. xml после builder.parse)?

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);

DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse("pathtoyour.xml");

XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "//jp06:role-assignment/jp06:url";
NodeList nodes = (NodeList) xpath.evaluate(expression, document, XPathConstants.NODESET);

System.out.println(nodes);
...