Извлеките все повторяющиеся элементы XML, используя java - PullRequest
1 голос
/ 14 февраля 2020

My XML выглядит следующим образом, и мне нужно извлечь несколько элементов ID в выводе xml: -

<?xml version="1.0" encoding="utf-8"?>
<Stock>
    <PIdentification>
    <CatalogVersion></CatalogVersion>
    <AccountID></AccountID>
    <CustomerId></CustomerId>
    </ProviderIdentification>
    <Product>
        <ArticleName>Monitors</ArticleName>
        <BaseUnit></BaseUnit>
        <Notes></Notes>
        <ID>11f13e2e-ae97-45b5-a9a9-23fa7f6bb767</ID>
        <ID>b22834c0-a570-4e6b-97c3-5067a14d118d</ID>
        <ID>ed458593-5e1a-4dc1-94f0-a66eeef2dd79</ID>
        <ID>d25584a9-1db2-48cf-9a70-9b81e5a7e7f2</ID>
    </Product>
</Stock>

Я использовал «Nodelist» для извлечения «ID», но я получаю только один элемент, а не все 4, ниже часть кода: -

{   
    Node IDNode = element.getElementsByTagName("ID").item(0);
    IDXml = toStringXml(IDNode , true);
}

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

    private static String toStringXml(Node elt, boolean xmlDeclaration) 
    throws TransformerException {
     TransformerFactory transformerFactory = TransformerFactory
        .newInstance();
    Transformer transformer = transformerFactory.newTransformer();

    if(xmlDeclaration)
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
    DOMSource source = new DOMSource(elt);
    StreamResult result = new StreamResult(new StringWriter());
    transformer.transform(source, result);

    return result.getWriter().toString();
    }

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Вы получили все идентификаторы, но вы просматриваете только первый элемент с .item(id).

Метод getElementsByTageName("ID") возвращает вас NodeList, поэтому вы можете получить все идентификаторы, например, так:

File xmlFile = new File("src/main/resources/example.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document element = dBuilder.parse(xmlFile);

NodeList list = element.getElementsByTagName("ID");
for (int i = 0; i < list.getLength(); i++){
    Node specificIDNode = list.item(i);
    System.out.println(specificIDNode.getTextContent());
}
0 голосов
/ 24 февраля 2020

Вы неправильно указали XML, отображаемый в вашем вопросе. Незакрытый тег <PIdentification> в строке 3.

Правильный XML код должен выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Stock>
    <ProviderIdentification>
        <CatalogVersion></CatalogVersion>
        <AccountID></AccountID>
        <CustomerId></CustomerId>
    </ProviderIdentification>
    <Product>
        <ArticleName>Monitors</ArticleName>
        <BaseUnit></BaseUnit>
        <Notes></Notes>
        <ID>11f13e2e-ae97-45b5-a9a9-23fa7f6bb767</ID>
        <ID>b22834c0-a570-4e6b-97c3-5067a14d118d</ID>
        <ID>ed458593-5e1a-4dc1-94f0-a66eeef2dd79</ID>
        <ID>d25584a9-1db2-48cf-9a70-9b81e5a7e7f2</ID>
    </Product>
</Stock>

И в этом случае код, предоставленный @ Penguin74, отображает все IDS из ваш xml (проверьте картинку ниже).

demo

Если это решит ваш вопрос, пожалуйста, проголосуйте и отметьте как решение Penguin74, не мой.

...