Как создать несколько записей XML из простого XML - PullRequest
0 голосов
/ 03 декабря 2018

мой входной XML-код

<?xml version="1.0" encoding="UTF-8"?>
<CompoundEmployee>
   <person>
    <person_id_external>12345</person_id_external>
    <created_on_timestamp>2018-01-21T02:11:17.000Z</created_on_timestamp>
    <date_of_birth>1982-03-25</date_of_birth>
    <last_modified_on>2015-11-13T04:08:45.000Z</last_modified_on>
    <person_id>3231</person_id>
    <personal_information>
      <start_date>2015-11-13</start_date>
      <end_date>9999-12-31</end_date>
      <first_name>Joe</first_name>
      <gender>M</gender>
      <is_overridden>false</is_overridden>
      <last_name>Blogg</last_name>
    </personal_information>
    <address_information>
      <address_type>home</address_type>
      <start_date>2016-11-01</start_date>
      <address1>9870 Fox  Drive</address1>
      <address2>Apt 30099</address2>
      <address4> test value of address 4</address4>
      <city>Michigan</city>
      <country>USA</country>
      <end_date>9999-12-31</end_date>
      <state>MI</state>
      <zip_code>48638</zip_code>
    </address_information>
   </person>
</CompoundEmployee>

Я хочу вывод в следующем формате

<?xml version="1.0" encoding="UTF-8"?>
<Recrods>
    <recrod>
        <EmpID>12345</EmpID>
        <FieldName>address1</FieldName>
        <FieldValue>9870 Fox  Drive</FieldValue>
    </record>
    <recrod>
        <EmpID>12345</EmpID>
        <FieldName>address2</FieldName>
        <FieldValue>Apt 30099</FieldValue>
    </record>
    <recrod>
        <EmpID>12345</EmpID>
        <FieldName>city</FieldName>
        <FieldValue>Michigan</FieldValue>
    </record>   
    <recrod>
        <EmpID>12345</EmpID>
        <FieldName>country</FieldName>
        <FieldValue>USA</FieldValue>
    </record>
</Recrods>

В основном одна "запись" для каждого поля узла "address_information". Я могусоздать одну запись, но не уверен, как добавить несколько записей.

SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(is);
private static final String empId = null;   
private static final String ELE_NAME_ROOT = "Records";
private static final String ELE_NAME_RECORD = "record";
private static final String address1 = null;
private static final String address2 = null;
private static final String city = null;

XPath Person;
Person = XPath.newInstance("/*/person");

myElements = Person.selectNodes(doc);

for (Element myElement: myElements) {

empId = myElement.getChildText("person_id_external");
}


AddInfo = XPath.newInstance("/*/person/address_information");

myElements = AddInfo.selectNodes(doc);

for (Element myElement: myElements) {
         address_type=myElement.getChildText("address_type");
        if (address_type == 'home') {
            address1 = myElement.getChildText("address1");
            address2 = myElement.getChildText("address2");
            city = myElement.getChildText("city");

        }
    }


    Document doc1 = new Document();

    //CB_MUNICIP

    if ( address1 != null)
    {

    Element eleRoot = new Element(ELE_NAME_ROOT);
    doc1.setRootElement(eleRoot);

    Element eleRecord = new Element(ELE_NAME_RECORD);
    eleRoot.addContent(eleRecord);
    if( empId != null)
    {
    Element eleField = new Element("EMPID");
    eleField.setText(empId);
    eleRecord.addContent(eleField);
    }

    Element eleField4 = new Element("FieldName");
    eleField4.setText("address1");
    eleRecord.addContent(eleField4);

    Element eleField5 = new Element("FieldValue");
    eleField5.setText(address1);
    eleRecord.addContent(eleField5); 
    }

Создается только один, когда я пытаюсь добавить аналогичный код второго элемента (address2), он не работает.Любая помощь будет оценена. Также я пытаюсь выяснить, как мне написать функцию, которая будет создавать записи вместо того, чтобы делать это для каждого поля.* простите меня, я новичок в Groovy "

1 Ответ

0 голосов
/ 04 декабря 2018

Groovy построитель разметки здесь более полезен.

import groovy.xml.MarkupBuilder


def data = """<?xml version="1.0" encoding="UTF-8"?>
<CompoundEmployee>
   <person>
    <person_id_external>12345</person_id_external>
    <created_on_timestamp>2018-01-21T02:11:17.000Z</created_on_timestamp>
    <date_of_birth>1982-03-25</date_of_birth>
    <last_modified_on>2015-11-13T04:08:45.000Z</last_modified_on>
    <person_id>3231</person_id>
    <personal_information>
      <start_date>2015-11-13</start_date>
      <end_date>9999-12-31</end_date>
      <first_name>Joe</first_name>
      <gender>M</gender>
      <is_overridden>false</is_overridden>
      <last_name>Blogg</last_name>
    </personal_information>
    <address_information>
      <address_type>home</address_type>
      <start_date>2016-11-01</start_date>
      <address1>9870 Fox  Drive</address1>
      <address2>Apt 30099</address2>
      <address4> test value of address 4</address4>
      <city>Michigan</city>
      <country>USA</country>
      <end_date>9999-12-31</end_date>
      <state>MI</state>
      <zip_code>48638</zip_code>
    </address_information>
   </person>
</CompoundEmployee>"""

def compoundEmployee = new XmlParser().parseText(data)

def employeeID = compoundEmployee.person.person_id_external.text()
def address = compoundEmployee.person.address_information[0];


def writer = new StringWriter()
def op = new MarkupBuilder(writer)
op.records() {

    address.children().each { Node myNode ->
        record() {
            empID(employeeID)
            FieldName(myNode.name())
            FieldValue(myNode.text())
        }
    }
}

println(writer.toString())

Дает

<records>
  <record>
    <empID>12345</empID>
    <FieldName>address_type</FieldName>
    <FieldValue>home</FieldValue>
  </record>
  <record>
    <empID>12345</empID>
    <FieldName>start_date</FieldName>
    <FieldValue>2016-11-01</FieldValue>
  </record>
  <record>
    <empID>12345</empID>
    <FieldName>address1</FieldName>
    <FieldValue>9870 Fox  Drive</FieldValue>
  </record>
  <record>
    <empID>12345</empID>
    <FieldName>address2</FieldName>
    <FieldValue>Apt 30099</FieldValue>
  </record>
  <record>
    <empID>12345</empID>
    <FieldName>address4</FieldName>
    <FieldValue> test value of address 4</FieldValue>
  </record>
  <record>
    <empID>12345</empID>
    <FieldName>city</FieldName>
    <FieldValue>Michigan</FieldValue>
  </record>
  <record>
    <empID>12345</empID>
    <FieldName>country</FieldName>
    <FieldValue>USA</FieldValue>
  </record>
  <record>
    <empID>12345</empID>
    <FieldName>end_date</FieldName>
    <FieldValue>9999-12-31</FieldValue>
  </record>
  <record>
    <empID>12345</empID>
    <FieldName>state</FieldName>
    <FieldValue>MI</FieldValue>
  </record>
  <record>
    <empID>12345</empID>
    <FieldName>zip_code</FieldName>
    <FieldValue>48638</FieldValue>
  </record>
</records>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...