2015-03-19 7 views
0

Я пытаюсь добавить новую строку тега "" с разными атрибутами. Я могу редактировать существующую строку, но не могу добавить новый тег, имеющий разные атрибуты.Добавить новый тег в файл XML с различными атрибутами

XML-файл

<elementDefinitionPackage elementDefinitionPackageName="kohler-decisionmaker" elementDefinitionPackageVersion="3.2.0.42" elementLibraryFilename="libkohler-decisionmaker.so" elementLibraryVersion="3.2.0.42" minSupportedGDDVersion="1.0" minSupportedUMGFirmwareVersion="1.1.0.0" xmlns="http://xmlns.commonplatform.avocent.com/mss/ddt/template" xmlns:cm="http://xmlns.commonplatform.avocent.com/mss/ddt/common" xmlns:r="http://xmlns.commonplatform.avocent.com/mss/ddt/rules" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.commonplatform.avocent.com/mss/ddt/template XSD_ddt.xsd   http://xmlns.commonplatform.avocent.com/mss/ddt/rules XSD_rules.xsd   http://xmlns.commonplatform.avocent.com/mss/ddt/common XSD_common.xsd"> 
<elementDefinitionModel manufacturerInSymbol="KOHLER" minSupportedVersionInSymbol="1.4" modelInSymbol="DEC4000" modelQualifierInSymbol="DEC4000" symbolTag="KOHLERDEC4000DEC4000"> 
    <supportedprotocols> 
     <supportedProtocol isSubscribable="false" protocolName="MODBUS/RS-485"> 
      <properties> 
       <property category="EXTCOMM" defaultValue="502" definition="PORT" valueType="Integer" /> 
       <property category="EXTCOMM" defaultValue="60" definition="TIMEOUT" valueType="Integer" /> 
       <property category="EXTCOMM" defaultValue="1" definition="SLAVEID" valueType="Integer"/> 
      </properties> 
      <datapoints> 
       <datapoint division="COLL_COMP_CEP" nature="PARAMETRIC" programmaticName="t_val_calc_enrg_interval"/> 
      </datapoints> 
      <events> 
       <event address="3.{SLAVEID}.40259.1" programmaticName="t_evt_gen_mainTankAlarm" values="a:1 i:0" /> 
      </events> 
      <commands> 
       <command access="RW" address="#RWDA 3.{SLAVEID}.61105 6.{SLAVEID}.61105" division="CONTROL" nature="ENUM" programmaticName="t_st_gen_setControl" valueTypeInDevice="DATA_POINT_VALUE_TYPE_INTEGER" /> 
      </commands> 
     </supportedProtocol> 
    </supportedprotocols> 
    <rules> 
    </rules> 
     <similarModels> 
      <similarModel manufacturerInSymbol="KOHLER" minSupportedVersionInSymbol="1.4" modelInSymbol="KD440" modelQualifierInSymbol="KD440" symbolTag="KOHLERKD440KD440"/> 
     </similarModels> 
</elementDefinitionModel> 

Ожидаемый результат XML-файл

 <elementDefinitionPackage elementDefinitionPackageName="kohler-decisionmaker" elementDefinitionPackageVersion="3.2.0.42" elementLibraryFilename="libkohler-decisionmaker.so" elementLibraryVersion="3.2.0.42" minSupportedGDDVersion="1.0" minSupportedUMGFirmwareVersion="1.1.0.0" xmlns="http://xmlns.commonplatform.avocent.com/mss/ddt/template" xmlns:cm="http://xmlns.commonplatform.avocent.com/mss/ddt/common" xmlns:r="http://xmlns.commonplatform.avocent.com/mss/ddt/rules" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.commonplatform.avocent.com/mss/ddt/template XSD_ddt.xsd   http://xmlns.commonplatform.avocent.com/mss/ddt/rules XSD_rules.xsd   http://xmlns.commonplatform.avocent.com/mss/ddt/common XSD_common.xsd"> 
<elementDefinitionModel manufacturerInSymbol="KOHLER" minSupportedVersionInSymbol="1.4" modelInSymbol="DEC4000" modelQualifierInSymbol="DEC4000" symbolTag="KOHLERDEC4000DEC4000"> 
    <supportedprotocols> 
     <supportedProtocol isSubscribable="false" protocolName="MODBUS/RS-485"> 
      <properties> 
       <property category="EXTCOMM" defaultValue="502" definition="PORT" valueType="Integer" /> 
       <property category="EXTCOMM" defaultValue="60" definition="TIMEOUT" valueType="Integer" /> 
       <property category="EXTCOMM" defaultValue="1" definition="SLAVEID" valueType="Integer"/> 
      </properties> 
      <datapoints> 
       <datapoint division="COLL_COMP_CEP" nature="PARAMETRIC" programmaticName="t_val_calc_enrg_interval"/> 
      </datapoints> 
      <events> 
       <event address="3.{SLAVEID}.40259.1" programmaticName="t_evt_gen_mainTankAlarm" values="a:1 i:0" /> 
      </events> 
      <commands> 
       <command access="RW" address="#RWDA 3.{SLAVEID}.61105 6.{SLAVEID}.61105" division="CONTROL" nature="ENUM" programmaticName="t_st_gen_setControl" valueTypeInDevice="DATA_POINT_VALUE_TYPE_INTEGER" /> 
      </commands> 
     </supportedProtocol> 
    </supportedprotocols> 
    <rules> 
    </rules> 
     <similarModels> 
      <similarModel manufacturerInSymbol="KOHLER" minSupportedVersionInSymbol="1.4" modelInSymbol="KD440" modelQualifierInSymbol="KD440" symbolTag="KOHLERKD440KD440"/> 
      <similarModel manufacturerInSymbol="KOHLER" minSupportedVersionInSymbol="1.4" modelInSymbol="A" modelQualifierInSymbol="B" symbolTag="C"/> 
     </similarModels> 
</elementDefinitionModel> 

Java Code

private static void updat() { 
    NodeList similarmodels = doc.getElementsByTagName("similarModels"); 
    Element model = null; 
    for(int i=0; i<similarmodels.getLength();i++){ 
     model = (Element) similarmodels.item(i); 
     String model = model.getElementsByTagName("similarModel").item(0).getFirstChild().getNodeValue(); 
     if(model.equalsIgnoreCase("KD440")){ 
      model.setAttribute("A"); 
     }else{ 
      model.setAttribute("B"); 
     } 
    } 
} 

Есть ли способ сделать это в JAXB & xsd ??

+0

Можете ли вы поделиться неожиданным результатом или кодом, который вы используете, чтобы добавить новую строку. Код, которым вы делитесь, - это отредактировать существующую строку, но ваш вопрос говорит, что ваш код не работает, когда вы пытаетесь добавить новую строку – tinker

ответ

0

Не должно быть проблем ни с DOM, ни с JAXB. В JAXB вы должны просто создать новый объект SimilarModel, который затем можно добавить в список объектов SimilarModels.