Как отформатировать это выражение так, чтобы при запуске for-цикла он выбирал только те атрибуты анализа, которые пусты. Причина в том, что существует несколько templateNames с одинаковыми значениями. Это моя попытка, но не может заставить работатьXpath только выбрать атрибут с пустым значением
String theXpath = "//report-plan[@name='"+ templateName +"']/settings/@analysis=''";
Пример кода:
public class XPathTestReports {
public static void main(String[] args) {
try {
String outputFile = "c:/workspace/samplenew.xml";
String inputFile = "c:/workspace/sample.xml";
Document doc = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().parse(new InputSource(inputFile));
// locate the node(s)
XPath xpath = XPathFactory.newInstance().newXPath();
// lOAD THE File
CSVImporterReports loader = new CSVImporterReports("C:/REPORT_TEMPLATES.csv");
List <OnConfig> entries = loader.getEntries();
for (OnConfig c: entries) {
String templateName = c.getTemplateName();
String analName = c.getAnalysisName();
String paramName = c.getParamName();
String theXpath = "//report-plan[@name='" + templateName + "']/settings/@analysis=''";
NodeList nodes = (NodeList) xpath.evaluate(theXpath, doc, XPathConstants.NODESET);
// make the change
for (int i = 0; i < nodes.getLength(); i++) {
nodes.item(i).setTextContent(analName);
// nodes.item(i).setTextContent(paramName);
}
}
try {
// save the result
Transformer xformer = TransformerFactory.newInstance().newTransformer();
xformer.transform(new DOMSource(doc), new StreamResult(new File(outputFile)));
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
} catch (TransformerFactoryConfigurationError e) {
// TODO Auto-generated catch block
} catch (TransformerException e) {
// TODO Auto-generated catch block
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
}
Пример XML:
<report-plan name="generic">
<columns>
<column name="Nominal" subtotal-function="Sum" total-function="Sum"/>
<column name="Trade"/>
</columns>
<settings analysis="" analysisParameters="" filtering-enabled="true" object-actions="false" show-object-actions="true" sorting-enabled="true"/>
</report-plan>
<report-plan name="generic">
<columns>
<column name="Nominal" subtotal-function="Sum" total-function="Sum"/>
<column name="Trade"/>
</columns>
<settings analysis="" analysisParameters="" filtering-enabled="true" object-actions="false" show-object-actions="true" sorting-enabled="true"/>
</report-plan>
<report-plan name="sensitive">
<columns>
<column name="Nominal" subtotal-function="Sum" total-function="Sum"/>
<column name="Trade"/>
</columns>
<settings analysis="" analysisParameters="" filtering-enabled="true" object-actions="false" show-object-actions="true" sorting-enabled="true"/>
</report-plan>
На данный момент мой код ввода такое же значение, как для отчеты называются generic. Несмотря на то, что атрибуты анализа имеют разные значения для ввода. Мне нужен код для ввода разных значений анализа, даже если имена отчетов одинаковы.
Выход:
<report-plan name="generic">
<columns>
<column name="Nominal" subtotal-function="Sum" total-function="Sum"/>
<column name="Trade"/>
</columns>
<settings analysis="newValue" analysisParameters="" filtering-enabled="true" object-actions="false" show-object-actions="true" sorting-enabled="true"/>
</report-plan>
<report-plan name="generic">
<columns>
<column name="Nominal" subtotal-function="Sum" total-function="Sum"/>
<column name="Trade"/>
</columns>
<settings analysis="newValue" analysisParameters="" filtering-enabled="true" object-actions="false" show-object-actions="true" sorting-enabled="true"/>
</report-plan>
<report-plan name="sensitive">
<columns>
<column name="Nominal" subtotal-function="Sum" total-function="Sum"/>
<column name="Trade"/>
</columns>
<settings analysis="someValue" analysisParameters="" filtering-enabled="true" object-actions="false" show-object-actions="true" sorting-enabled="true"/>
</report-plan>
CSV образец
TEMPLATE_NAME ANALYSIS_NAME PARAM_NAME
generic analval1 paramval1
generic analval2 paramval2
sensitivity analval3 paramval3
Что случилось с вашей текущей XPath? – har07
Выберите только _что точно, если атрибут 'анализ' пуст? –
Выберите этот атрибут анализа только в этом элементе плана отчета. Есть несколько элементов плана отчета, некоторые из которых имеют значения, а другие пустые, поэтому я выбираю только те, которые пусты. Обновлен, чтобы показать связанный код. – Kelv