R
R
Rustam Akhmetov2014-07-10 08:16:20
Python
Rustam Akhmetov, 2014-07-10 08:16:20

How to convert xml source structure to xml structure sample?

There are two xml structures: source(I) and sample(O).
Required:
1. From (I) remove the nodes that are missing in (O).
2. From (O) add nodes that are missing in (I). Fill in the added nodes with values ​​from (O).
Example
Source

<CatalogObject.Организации>
  <Поле1>исходник. поле1</Поле1>
  <Поле2>исходник. поле2</Поле2>
  <Поле3/>
  <Таблица1>
    <Строка>
      <Колонка1>исходник. таблица 1. строка1. колонка1</Колонка1>
      <Колонка2>исходник. таблица 1. строка1. колонка2</Колонка2>
      <Колонка3>исходник. таблица 1. строка1. колонка3</Колонка3>
      <Колонка4>исходник. таблица 1. строка1. колонка4</Колонка4>
    </Строка>
    <Строка>
      <Колонка1>исходник. таблица 1. строка2. колонка1</Колонка1>
      <Колонка2>исходник. таблица 1. строка2. колонка2</Колонка2>
      <Колонка3>исходник. таблица 1. строка2. колонка3</Колонка3>
      <Колонка4>исходник. таблица 1. строка2. колонка4</Колонка4>
    </Строка>
  </Таблица1>
  <Таблица3>
    <Строка>
      <Колонка1>исходник. таблица 3. колонка1</Колонка1>
      <Колонка2>исходник. таблица 3. колонка2</Колонка2>
      <Колонка3>исходник. таблица 3. колонка3</Колонка3>
    </Строка>
  </Таблица3>    
</CatalogObject.Организации>

Sample
<CatalogObject.Организации>
  <Поле1>образец поле1</Поле1>
  <Поле2>образец поле2</Поле2>
  <Поле4/>
  <Поле5>образец поле5</Поле5>
  <Таблица1>
    <Строка>
      <Колонка1>образец. таблица1. колонка1</Колонка1>
      <Колонка2>образец. таблица1. колонка2</Колонка2>
      <Колонка3>образец. таблица1. колонка3</Колонка3>
      <Колонка5>образец. таблица1. колонка5</Колонка5>
    </Строка>
  </Таблица1>
  <Таблица2>
    <Строка>
      <Колонка5>образец. таблица2. колонка5</Колонка5>
      <Колонка6>образец. таблица2. колонка6</Колонка6>
      <Колонка7>образец. таблица2. колонка7</Колонка7>
    </Строка>
  </Таблица2>
</CatalogObject.Организации>

Result
<CatalogObject.Организации>
  <Поле1>исходник. поле1</Поле1>
  <Поле2>исходник. поле2</Поле2>
  <Поле4/>
  <Поле5>образец поле5</Поле5>
  <Таблица1>
    <Строка>
      <Колонка1>исходник. таблица 1. строка1. колонка1</Колонка1>
      <Колонка2>исходник. таблица 1. строка1. колонка2</Колонка2>
      <Колонка3>исходник. таблица 1. строка1. колонка3</Колонка3>
      <Колонка5>образец. таблица1. колонка5</Колонка5>
    </Строка>
    <Строка>
      <Колонка1>исходник. таблица 1. строка2. колонка1</Колонка1>
      <Колонка2>исходник. таблица 1. строка2. колонка2</Колонка2>
      <Колонка3>исходник. таблица 1. строка2. колонка3</Колонка3>
      <Колонка5>образец. таблица1. колонка5</Колонка5>
    </Строка>
  </Таблица1>
  <Таблица2>
    <Строка>
      <Колонка5>образец. таблица2. колонка5</Колонка5>
      <Колонка6>образец. таблица2. колонка6</Колонка6>
      <Колонка7>образец. таблица2. колонка7</Колонка7>
    </Строка>
  </Таблица2>
</CatalogObject.Организации>

Answer the question

In order to leave comments, you need to log in

2 answer(s)
A
Andrey K, 2014-07-10
@mututunus

XSLT will help you.

C
Cyril, 2014-07-10
@llirikkkk

Did a similar task, only searching for extra/missing nodes and values
​​Used C# -> System.Xml.Linq (well, or whatever you want
)
for example:
CatalogObject.Organizations>Field1=sample field1
CatalogObject.Organizations>Table1>Row>Column1=source. table 1. row1. column1
1.1. We add them to Dictionary(string, XElement) to simplify subsequent access to them
2. traverse the entire source tree and similarly form a path for each node
3. potentially all paths are unique. looking for extra/missing paths.
4. delete the extra ones from the source, add the missing ones (take from the Dictionary)
in my case, it was necessary to check xml files for a complete match, so in the path I also used attributes (+ their values) and the values ​​of the elements themselves
looked something like this
root> [email protected][email protected]=value=value of the node
or
root> node2> [email protected][email protected]=value>node4=valueNode
if the values ​​of the elements may not match,
then everything rests on the formation of a unique path to each node
, you can add indexing in the path for matching elements
CatalogObject.Organizations>Table[10]>String[2]
PS It is more pleasant for me to write a possible bike than to look for specific ready-made solutions :)

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question