Копирование и вставка фрагмента структуры XML - PullRequest
0 голосов
/ 04 апреля 2019

Я новичок в редактировании xml, и мне нужно скопировать фрагмент файла xml, описывающего переменную в TIA Portal, и вставить его чуть ниже в тот же файл, чтобы я получил еще одну переменную, которую позже смогу редактировать.Существует ли строгая функция «копирования» для дублирования всего фрагмента структуры со всеми дочерними узлами и значениями внутри?Как текст копировать-вставить?

Вот фрагмент XML, который я хочу скопировать 1: 1:

  <Hmi.Tag.Tag ID="40C" CompositionName="Tags">
    <AttributeList>
      <AcquisitionTriggerMode>Visible</AcquisitionTriggerMode>
      <AddressAccessMode>Symbolic</AddressAccessMode>
      <Coding>Binary</Coding>
      <ConfirmationType>None</ConfirmationType>
      <GmpRelevant>false</GmpRelevant>
      <JobNumber>0</JobNumber>
      <Length>2</Length>
      <LinearScaling>false</LinearScaling>
      <LogicalAddress />
      <MandatoryCommenting>false</MandatoryCommenting>
      <Name>Index_ManualControl[9]</Name>
      <Persistency>false</Persistency>
      <QualityCode>false</QualityCode>
      <ScalingHmiHigh>100</ScalingHmiHigh>
      <ScalingHmiLow>0</ScalingHmiLow>
      <ScalingPlcHigh>10</ScalingPlcHigh>
      <ScalingPlcLow>0</ScalingPlcLow>
      <StartValue />
      <SubstituteValue />
      <SubstituteValueUsage>None</SubstituteValueUsage>
      <Synchronization>false</Synchronization>
      <UpdateMode>ProjectWide</UpdateMode>
      <UseMultiplexing>false</UseMultiplexing>
    </AttributeList>
    <LinkList>
      <AcquisitionCycle TargetID="@OpenLink">
        <Name>1 s</Name>
      </AcquisitionCycle>
      <Connection TargetID="@OpenLink">
        <Name>OP170_HMI_Connection</Name>
      </Connection>
      <ControllerTag TargetID="@OpenLink">
        <Name>DB11000_OPXXX_StationData.ManualControl.Navigation.HMI_Index[9]</Name>
      </ControllerTag>
      <DataType TargetID="@OpenLink">
        <Name>Int</Name>
      </DataType>
      <HmiDataType TargetID="@OpenLink">
        <Name>Int</Name>
      </HmiDataType>
    </LinkList>
    <ObjectList>
      <MultilingualText ID="40E" CompositionName="Comment">
        <ObjectList>
          <MultilingualTextItem ID="40F" CompositionName="Items">
            <AttributeList>
              <Culture>en-US</Culture>
              <Text />
            </AttributeList>
          </MultilingualTextItem>
        </ObjectList>
      </MultilingualText>
      <MultilingualText ID="410" CompositionName="DisplayName">
        <ObjectList>
          <MultilingualTextItem ID="411" CompositionName="Items">
            <AttributeList>
              <Culture>en-US</Culture>
              <Text />
            </AttributeList>
          </MultilingualTextItem>
        </ObjectList>
      </MultilingualText>
      <MultilingualText ID="412" CompositionName="TagValue">
        <ObjectList>
          <MultilingualTextItem ID="413" CompositionName="Items">
            <AttributeList>
              <Culture>en-US</Culture>
              <Text />
            </AttributeList>
          </MultilingualTextItem>
        </ObjectList>
      </MultilingualText>
    </ObjectList>
  </Hmi.Tag.Tag>

Родительские узлы:

<Hmi.Tag.TagTable ID="0">
  <AttributeList>
    <Name>ManualControl</Name>
  </AttributeList>
  <ObjectList>

    (...)

  </ObjectList>

Мне нужно скопировать всю эту большую структуру и поместить ее точно внизу, так что внутри (...).Затем я буду использовать оператор for для генерации переменных в зависимости от размера массива из другого файла.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Большое спасибо, поэтому я сделал что-то вроде этого:

                XDocument doc1 = XDocument.Load(folderName1 + "\\" + TXTFiles[i]);
                XElement objectList = doc1.Descendants("ObjectList").FirstOrDefault();
                XElement HmiTag = objectList.Element("Hmi.Tag.Tag");
                objectList.Add(XElement.Parse(HmiTag.ToString()));

Итак, я хотел, чтобы он скопировал целое и вставил внутрь (...), и сделал это, как показано наприкрепленные изображения.

Здесь файл перед использованием кода

Файл после использования кода, 15 объектов, первый копируется и помещается в конец

0 голосов
/ 04 апреля 2019

Попробуйте использовать xml linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication107
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement objectList = doc.Descendants("ObjectList").FirstOrDefault();

            XElement multilingualText = objectList.Element("MultilingualText");

            objectList.Add(XElement.Parse(multilingualText.ToString()));


        }
    }


}
...