Вставьте / Замените xml в указанный узел Xdocument - PullRequest
0 голосов
/ 24 августа 2018

У меня есть следующий XDocument:

<root>
  <object>
    <objectname>Schedule</objectname>
    <mode>Edit</mode>
    <row>
      <idObject>1</idObject>
      <BeginDate>2018-08-07</BeginDate>
      <EndDate>2018-08-07</EndDate>
      <TotalSum>300.17</TotalSum>
      <ScheduleOperation></ScheduleOperation>
    </row>
  </object>
</root>

И следующий XML, который я получил с помощью метода SelectSingleNode объекта XmlDocument:

<ScheduleOperation>
   <row>
      <Sum>1000.00</Sum>
      <Date>2017-09-25T00:00:00</Date>        
   </row>
</ScheduleOperation>

Как я могу вставить / заменить этот XML вУзел ScheduleOperation XDocument для получения результата следующим образом:

<root>
  <object>
    <objectname>Schedule</objectname>
    <mode>Edit</mode>
    <row>
      <idObject>1</idObject>
      <BeginDate>2018-08-07</BeginDate>
      <EndDate>2018-08-07</EndDate>
      <TotalSum>300.17</TotalSum>
      <ScheduleOperation>
        <row>
          <Sum>1000.00</Sum>
          <Date>2017-09-25T00:00:00</Date>
        </row>
      </ScheduleOperation>
    </row>
  </object>
</root>

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Учитывая ваш xdocument.xml как:

<root>
  <object>
    <objectname>Schedule</objectname>
    <mode>Edit</mode>
    <row>
      <idObject>1</idObject>
      <BeginDate>2018-08-07</BeginDate>
      <EndDate>2018-08-07</EndDate>
      <TotalSum>300.17</TotalSum>
      <ScheduleOperation></ScheduleOperation>
    </row>
  </object>
</root>

и этот t.xslt файл:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <!-- Identity transform -->
  <xsl:template match="@* | node()">
     <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
          </xsl:copy>
  </xsl:template>
  <xsl:template match="/root/object/row/ScheduleOperation">
     <ScheduleOperation>
       <row>
         <Sum>1000.00</Sum>
         <Date>2017-09-25T00:00:00</Date>
       </row>
     </ScheduleOperation>
  </xsl:template>
</xsl:stylesheet>

Вы используете xmlstarlet, чтобы вставить узел:

xmlstarlet tr t.xslt xdocument.xml
<?xml version="1.0"?>
<root>
  <object>
    <objectname>Schedule</objectname>
    <mode>Edit</mode>
    <row>
      <idObject>1</idObject>
      <BeginDate>2018-08-07</BeginDate>
      <EndDate>2018-08-07</EndDate>
      <TotalSum>300.17</TotalSum>
      <ScheduleOperation><row><Sum>1000.00</Sum><Date>2017-09-25T00:00:00</Date></row></ScheduleOperation>
    </row>
  </object>
</root>
0 голосов
/ 24 августа 2018

ОК, с помощью этого сообщения Мне удалось сделать это:

void Main()
{

    var initialXDoc = XDocument.Parse(Xml());   
    var emptyScheduleOperation = initialXDoc.XPathSelectElement("/root/object/row/ScheduleOperation");

    var xDocScheduleOperation = XDocument.Parse(Xml2());
    var scheduleOperation = xDocScheduleOperation.XPathSelectElement("ScheduleOperation");

    emptyScheduleOperation.ReplaceWith(scheduleOperation);
}

// initial xml:
private string Xml() => @"
<root>
  <object>
    <objectname>Schedule</objectname>
    <mode>Edit</mode>
    <row>
      <idObject>1</idObject>
      <BeginDate>2018-08-07</BeginDate>
      <EndDate>2018-08-07</EndDate>
      <TotalSum>300.17</TotalSum>
      <ScheduleOperation></ScheduleOperation>
    </row>
  </object>
</root>
";

// should be inserted into the initial xml
private string Xml2() => @"
<ScheduleOperation>
   <row>
      <Sum>1000.00</Sum>
      <Date>2017-09-25T00:00:00</Date>        
   </row>
</ScheduleOperation>
";
...