Синтаксический анализ XML с помощью java — не получает все значения xml

#java #xml #xml-parsing #document #writexml

#java #xml #xml-синтаксический анализ #документ #writexml

Вопрос:

Попытка проанализировать xml, чтобы получить значение тега «CreDtTm» из этого XML (вставлено не все):

     <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
    <CstmrCdtTrfInitn>
        <GrpHdr>
            <MsgId>SANDISS_2020_10_08_001</MsgId>
            <CreDtTm>2020-10-15T18:15:33</CreDtTm>
            <NbOfTxs>3</NbOfTxs>
            <CtrlSum>36.00</CtrlSum>
            <InitgPty>
                <Nm>Bank</Nm>
                <Id>
                    <OrgId>
                        <Othr>
                            <Id>40100</Id>
                            <SchmeNm>
                                <Cd>COID</Cd>
                            </SchmeNm>
                        </Othr>
                    </OrgId>
                </Id>
            </InitgPty>
        </GrpHdr>
  

Однако получение не всех значений

Значения узла

введите описание изображения здесь

Вот метод для синтаксического анализа и редактирования xml (обратная запись в XML-файл пропускается atm)

  public void modifyXmlFile(String filePath, Map<String, String> tagValuesToChange) {
    try {
      DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
      Document document = docBuilder.parse(filePath);
      XPath xpath = XPathFactory.newInstance().newXPath();

      for (Map.Entry<String, String> entry : tagValuesToChange.entrySet()) {
        Node node = (Node) xpath.compile(entry.getKey()).evaluate(document, XPathConstants.NODE); //**This becomes null**
        node.setTextContent(entry.getValue());
      }
  

В основном тег не найден, а переменной узла присвоено значение null.
Не уверен, почему? Можете ли вы мне помочь?

Ответ №1:

Запуск вашего примера наводит меня на мысль, что ваш ключ на tagValuesToChange карте — это имя тега, а не допустимое выражение XPath. Попробуйте использовать //CreDtTm в качестве ключа к вашей карте и посмотрите, работает ли это.

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

Комментарии:

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