Member 11491784 Ответов: 3

Как объединить несколько XML-файлов в один с помощью VB.NET код.


<root>
<purchase></purchase>
<sales></sales>
</root>
<root>


Я хочу, чтобы это было так, потому что в настоящее время все эти xmls разные, и я хочу, чтобы они слились в один xml
<root>
<purchase></purchase>
<sales></sales>
</root>

<root>
<purchase></purchase>
<sales></sales>
</root>

После слияния всех xml-файлов я хочу создать из них один csv-файл.

Что я уже пробовал:

Для каждого xml в csvXmlList
Dim dsTemp как новый набор данных()
dsTemp.Метод readxml(в формате XML)
dsAll. Merge(dsTemp)
Следующий

3 Ответов

Рейтинг:
5

Member 11491784

Я получил решение, копнув еще немного в нескольких местах, и оно удивительно объединяет несколько XML-файлов, как и ожидалось. Я использовал XElement в VB.NET чтобы добиться этого.

Требование: - импорт :-

Imports System.Xml.Linq


Dim xdoc As XElement
Dim xdoc2 As XElement = <roots></roots>

For Each xml In XmlList
           xdoc = XElement.Parse(xml)
           xdoc2.Add(xdoc)

Next


Maciej Los

Неправильный подход! Пожалуйста, см. Мой ответ.

Рейтинг:
2

Patrice T

Это не xml-файл

<root>
    <purchase></purchase>
    <sales></sales>
</root>
<root></root>

Но это
<root>
    <purchase></purchase>
    <sales></sales>
</root>


Когда вы объединяете 2 xml-файла, вам нужно знать, что корень является уникальным в результирующем файле.
Таким образом, по крайней мере, результирующий файл может выглядеть следующим образом
<root>
    <purchase></purchase>
    <sales></sales>
</root>
<root></root>
<root></root>
    <purchase></purchase>
    <sales></sales>

<root></root>

Как вы можете видеть, слияние 2 xml-файлов - это не просто их объединение.


Рейтинг:
0

Maciej Los

Ну, нет простого способа объединить xml-документы. Почему? Вы должны быть полностью уверены, что желаемый контент будет в порядке (в аспекте структуры и ценностей).

Позвольте мне объяснить это на следующем примере:

//content of doc #1
string xcontent1 = @"<root>
<Item id='1'>
	<Subitems>
		<Subitem sid='1'>A</Subitem>
		<Subitem sid='2'>B</Subitem>
	</Subitems>
</Item>
<Item id='2'>
	<Subitems>
		<Subitem sid='1'>A</Subitem>
		<Subitem sid='2'>B</Subitem>
		<Subitem sid='3'>C</Subitem>
	</Subitems>
</Item>
</root>";
//content of doc #2
string xcontent2 = @"<root>
<Item id='1'>
	<Subitems>
		<Subitem sid='1'>A</Subitem>
		<Subitem sid='2'>E</Subitem>
		<Subitem sid='3'>F</Subitem>
	</Subitems>
</Item>
<Item id='3'>
	<Subitems>
		<Subitem sid='1'>A</Subitem>
		<Subitem sid='2'>B</Subitem>
		<Subitem sid='3'>C</Subitem>
	</Subitems>
</Item>
</root>";

//first document
XDocument xdoc1 = XDocument.Parse(xcontent1);
//second document
XDocument xdoc2 = XDocument.Parse(xcontent2);
//final document (merged)
XDocument xdst = new XDocument();
//add entire content of document #1
xdst.Add(xdoc1.Root);
//add content of document #2 without root
xdst.Root.Add(xdoc2.Root.Elements());


Результат объединенного документа:
<root>
  <Item id="1">
    <Subitems>
      <Subitem sid="1">A</Subitem>
      <Subitem sid="2">B</Subitem>
    </Subitems>
  </Item>
  <Item id="2">
    <Subitems>
      <Subitem sid="1">A</Subitem>
      <Subitem sid="2">B</Subitem>
      <Subitem sid="3">C</Subitem>
    </Subitems>
  </Item>
  <Item id="1">
    <Subitems>
      <Subitem sid="1">A</Subitem>
      <Subitem sid="2">E</Subitem>
      <Subitem sid="3">F</Subitem>
    </Subitems>
  </Item>
  <Item id="3">
    <Subitems>
      <Subitem sid="1">A</Subitem>
      <Subitem sid="2">B</Subitem>
      <Subitem sid="3">C</Subitem>
    </Subitems>
  </Item>
</root>


Как вы можете видеть, объединенный xml-документ содержит 2 Item узлы с одинаковыми id (1), но с другим содержанием (SubitemsЕсть одно правило, которое вы должны соблюдать: Программисты должны быть мудрее пользователей. ;)

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


g.bhangu

привет, это дает исключение: данные на корневом уровне недопустимы. Строка 1, Позиция 1.plz help. у меня такая же проблема, что я хочу добавить элементы, но корневой узел должен быть таким же. в нем не было ни единого пролома.

Maciej Los

Вы хотите сказать, что хотите второй корневой элемент? Вам следует избегать этого, потому что вы получите неправильную структуру xml-данных. Без ssing вашего xml я не могу помочь. Пожалуйста, не публикуйте его содержание в комментариях. Сделайте мне и другим членам клуба одолжение и разместите свой вопрос на доске быстрых ответов, используя Спросите ссылка.

g.bhangu

я решил эту проблему, спасибо. еще один вопрос :
https://www.codeproject.com/Questions/1193862/Compare-and-display-the-element-value-from-XML-fil

плз проверьте.