#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, чтобы вы могли консолидировать логику преобразования.