Что самый быстрый путь состоит в том, чтобы объединить два XML-файла в один

Используйте getCellInfo (), чтобы получить LAC и amp; CellID. Просто вызовите соответствующие методы:

int LAC = GPRSInfo.getCellInfo().getLAC();
int CELLID = GPRSInfo.getCellInfo().getCellId();
27
задан paradisonoir 11 June 2009 в 17:51
поделиться

7 ответов

Самый простой способ сделать это - использовать LINQ to XML. Вы можете использовать Union или Concat в зависимости от ваших потребностей.

var xml1 = XDocument.Load("file1.xml");
var xml2 = XDocument.Load("file2.xml");

//Combine and remove duplicates
var combinedUnique = xml1.Descendants("AllNodes")
                          .Union(xml2.Descendants("AllNodes"));

//Combine and keep duplicates
var combinedWithDups = xml1.Descendants("AllNodes")
                           .Concat(xml2.Descendants("AllNodes"));
44
ответ дан 28 November 2019 в 04:42
поделиться

Преобразование XSLT может сделать это:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="pXml1" select="''" />
  <xsl:param name="pXml2" select="''" />
  <xsl:param name="pRoot" select="'root'" />

  <xsl:template match="/">
    <xsl:variable name="vXml1" select="document($pXml1)" />
    <xsl:variable name="vXml2" select="document($pXml2)" />

    <xsl:element name="{$pRoot}">
      <xsl:copy-of select="$vXml1/*/*" />
      <xsl:copy-of select="$vXml2/*/*" />
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

Передайте имена файлов в качестве параметров, а также имя нового корневого элемента.

Применить к любому XML-документу, например, пустой.

9
ответ дан 28 November 2019 в 04:42
поделиться

Если вы хотите использовать XmlDocument, попробуйте это

 var lNode = lDoc1.ImportNode(lDoc2.DocumentElement.FirstChild, true);
 lDoc1.DocumentElement.AppendChild(lNode);
2
ответ дан 28 November 2019 в 04:42
поделиться

Если вы можете гарантировать этот формат, вы можете комбинировать их, выполняя манипуляции со строками:

  • Прочтите первый файл, сохраните все до ""
  • Прочтите второй файл, удалите часть до ""
  • Объедините эти строки.

Это должен быть самый быстрый способ, поскольку синтаксический анализ не требуется.

const string RelevantTag = "AllNodes";

string xml1 = File.ReadAllText(xmlFile1);
xml1 = xml1.Substring(0, xml.LastIndexOf("</" + RelevantTag + ">"));

string xml2 = File.ReadAllText(xmlFile2);
xml2 = xml2.Substring(xml.IndexOf("<" + RelevantTag + ">") + "<" + RelevantTag + ">".Length, xml1.Length);

File.WriteAllText(xmlFileCombined, xm1 + xml2);

Тем не менее, я всегда предпочел бы безопасный способ быстрому.

2
ответ дан 28 November 2019 в 04:42
поделиться

У вас есть два основных варианта:

  1. Анализировать xml, объединять структуры данных, сериализовать обратно в xml.

  2. Если вы знаете структуру, используйте некоторые базовые манипуляции со строкой, чтобы взломать ее . Например, в приведенном выше примере вы можете взять внутреннюю часть всех узлов в двух блоках xml и поместить их в один блок всех узлов, и все готово.

1
ответ дан 28 November 2019 в 04:42
поделиться

Если бы я делал это (используя C #), я бы создал класс, в который я могу десериализовать этот XML (для этого можно использовать xsd.exe), а затем перебрать все узлов в объекте, представляющем первую часть XML, и «Добавить» их в свойство AllNodes объекта, представляющего второй XML.

Затем сериализуйте второй класс обратно из XML, и он должен выглядеть как ваш третий пример.

0
ответ дан 28 November 2019 в 04:42
поделиться

Поскольку вы запросили самый быстрый :

Если (и только если) структура xml всегда согласована: (это псевдокод)

string xml1 = //get xml1 somehow
string xml2 = //get xml2 somehow
xml1 = replace(xml1, "<?xml version=\"1.0\" encoding=\"utf-8\"?>", "");
xml1 = replace(xml1, "<allnodes>", "");
xml1 = replace(xml1, "</allnodes>", "");
xml2 = replace(xml2, "<allnodes>", "<allnodes>\n" + xml1);

Это гигантский взлом, но это быстро. Ожидайте увидеть его на TheDailyWTF, когда ваши коллеги найдут его.

0
ответ дан 28 November 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: