2013-11-18 1 views
8

Я хочу добавить атрибут к существующему узлу xml. Я не хочу добавлять новые элементы (новые узлы) в свой XML-файл, просто хочу добавить новый атрибут. Как я могу это сделать?Добавить новые атрибуты существующего узла XML в java?

В частности, я попробовал эти строки кода:

Element process = doc.getElementsById("id"); 
    process.setAttribute("modelgroup", ""); 

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(); 
DOMSource source = new DOMSource(doc); 
StreamResult result = new StreamResult(new File("C:\\Users\\Blerta\\workspaceKEPLER\\XML_to_JSON\\SampleExample.xml")); 
transformer.transform(source, result); 

Но я получаю следующее исключение:

Exception in thread "main" java.lang.NullPointerException 
    at Main.appendAttributes(Main.java:172) 
    at Main.displayNodes(Main.java:65) 
    at Main.displayNodes(Main.java:138) 
    at Main.main(Main.java:42)** 
+0

Вставить строку, где nullpointer имеет значение –

ответ

11

в DOM парсер это очень легко. получить ваш узел и просто использовать эту функцию.

((Element)node).setAttribute("attr_name","attr_value"); 

затем, наконец, обновите свой документ. как это ..

 Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.setOutputProperty(OutputKeys.METHOD, "xml"); 
     transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "5"); 
     DOMSource source = new DOMSource(document); 
     StreamResult result = new StreamResult(new File(tablePath)); 
     transformer.transform(source, result); 
+4

Я уже пробовал это, но я не могу применить setAttribute к узлу – user2966458

+2

** doc.getElementsByTagName ("process"); ** это возвращает NodeList. попробуйте вот так. ** Список NodeList = doc.getElementsByTagName ("process"); **. Элемент el = (Элемент) list.item (0); то вы можете использовать el.setAttribute («attr_name», «attr_val»); – subash

+0

Что делать, если узел не приклеен к элементу? – Stephan

3

Вы можете сделать это в нескольких строках с помощью xslt. Oracle имеют половину достойной учебник со всеми фрагментами кода http://docs.oracle.com/javase/tutorial/jaxp/xslt/transformingXML.html

Ключ бит для XSLT будет что-то вроде следующего:

<xsl:template match="elementToAddNewAttrTo"> 
     <xsl:attribute name="newAttrName">NewAttrValue</xsl:attribute> 
    </xsl:template> 
5

Самый простой и самый короткий, чтобы бросить узел org.w3c.dom.Element, а затем вызывать setAttribute на нем:

((Element)aNode).setAttribute("name", "value"); 
+1

Что делать, если узел не поддается элементу? – Stephan

+0

Да, что, если aNode не расширяет класс Element? –

+0

@Stephan, не имеет смысла добавлять атрибут к чему-то, что не является элементом. –

0

Рекомендуемый подход:

Node node = ...; 
if(node.getNodeType() == Node.ELEMENT_NODE) 
{ 
    ((Element) node).setAttribute("name", "value"); 
} 

Ситуационный подход:

try 
{ 
    // ... 
    Node node = ...; 
    ((Element) node).setAttribute("name", "value"); 
    // ... 
} 
catch(ClassCastException e) 
{ 
    // Handle exception 
} 

использовать только попробуй поймать подход, если вы уже знаете, что все узлы, которые процесс должен быть типа «Элемент» (и, таким образом, любой другой случай «исключение» и должен выйти из кода).