2017-01-31 5 views
0

В настоящее время у меня есть два XML-файлыобъединить содержимое файла XML

one.xml // Первый файл

<LayoutEntry  name="b1t2mci"   value="$cfg_opt/one"   type=""/> 
    <LayoutEntry  name="b1t1ul"   value="$cfg_opt/two"   type=""/> 
    <LayoutEntry  name="b1t1fcv"   value="$BattCfgOpt/three"   type=""/> 

two.xml // Второй файл

<cfgOpt> 
     <one value="0" /> 
     <two value="9" /> 
     <three value="8" /> 
    </cfgOpt> 

мне нужно замените атрибут value в первом XML на один, найденный во втором файле XML.

I.e value = "$ cfg_opt/one" необходимо заменить как значение = "0". Поскольку во втором файле XML значение равно нулю.

Так как есть 1000 строк в файле, есть ли способ его автоматизировать?

ответ

0

У меня нет идеи автоматизировать его. Но да, вы можете объединить xml-файлы. Вы можете сделать это с помощью парсера DOM и кода XPath-Refer ниже, чтобы объединить файл. Внесите необходимые изменения в код ниже, чтобы достичь структуры вашего XML.

public class MergeXmlDemo { 
public static void main(String[] args) throws Exception { 
// proper error/exception handling omitted for brevity 
File file1 = new File("merge1.xml"); 
File file2 = new File("merge2.xml"); 
Document doc = merge("/run/host/results", file1, file2); 
print(doc); 

}

private static Document merge(String expression, 
    File... files) throws Exception { 
XPathFactory xPathFactory = XPathFactory.newInstance(); 
XPath xpath = xPathFactory.newXPath(); 
XPathExpression compiledExpression = xpath 
    .compile(expression); 
return merge(compiledExpression, files); 

}

private static Document merge(XPathExpression expression, 
    File... files) throws Exception { 
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory 
    .newInstance(); 
docBuilderFactory 
    .setIgnoringElementContentWhitespace(true); 
DocumentBuilder docBuilder = docBuilderFactory 
    .newDocumentBuilder(); 
Document base = docBuilder.parse(files[0]); 

Node results = (Node) expression.evaluate(base, 
    XPathConstants.NODE); 
if (results == null) { 
    throw new IOException(files[0] 
     + ": expression does not evaluate to node"); 
} 

for (int i = 1; i < files.length; i++) { 
    Document merge = docBuilder.parse(files[i]); 
    Node nextResults = (Node) expression.evaluate(merge, 
     XPathConstants.NODE); 
    while (nextResults.hasChildNodes()) { 
    Node kid = nextResults.getFirstChild(); 
    nextResults.removeChild(kid); 
    kid = base.importNode(kid, true); 
    results.appendChild(kid); 
    } 
} 

return base; 

}

private static void print(Document doc) throws Exception { 
TransformerFactory transformerFactory = TransformerFactory 
    .newInstance(); 
Transformer transformer = transformerFactory 
    .newTransformer(); 
DOMSource source = new DOMSource(doc); 
Result result = new StreamResult(System.out); 
transformer.transform(source, result); 

}

}

+0

Я хочу, чтобы значение должно быть установлено в содержимое другого файла –

Смежные вопросы