Найти и заменить строки XML-файла в Matlab - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть XML-файл, в котором я должен найти номера строк определенного тега и затем удалить все до этой строки.

Я пытался использовать xml2struct, но это не дает мне возможностиперейти к определенному номеру белья и удалить все до этого, а затем записать его обратно в новый XML-файл.

Очень жаль, если это не правильно сформулировано, я супер новичок в структурах файлов Matlab и XML ...

Это XML-файл: `

<?xml version="1.0" encoding="utf-8"?>
<SetBeam>
  <ControlPoints>
    <Cp>
      <Mu>1</Mu>
      <GantryRtn>40.79545455</GantryRtn>
      <Y1>4</Y1>
      <Y2>3.25</Y2>
      <X1>4.45455</X1>
      <X2>3.20455</X2>
      <Mlc>
        <ID>1</ID>
        <B>0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 -4.279 -4.279 1.812 2.395 0.687 3.187 3.219 2.363 3.469 3.469 2.594 1.043 0.25 1.5 3.75 3.75 3.75 3.75 3.75 1.062 -1.531 3.312 3.469 3.219 2.969 2.969 2.719 1.863 1.5 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125</B>
        <A>-0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 4.331 4.331 -1.656 -1.094 0.188 -1.594 -2.062 0.438 -1.582 0.938 -0.301 1.938 1.355 -0.812 2.688 -0.312 -0.5 2.387 -1.906 2.969 2.719 -2.387 -2.5 -2.219 2.469 -0.426 0.355 -0.062 -0.031 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125</A>
      </Mlc>
    </Cp>
    <Cp>
      <Mu>2</Mu>
      <GantryRtn>42.38636364</GantryRtn>
      <Y1>4</Y1>
      <Y2>3.25</Y2>
      <X1>4.45455</X1>
      <X2>3.20455</X2>
      <Mlc>
        <ID>1</ID>
        <B>0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 -4.279 -4.279 1.969 2.719 1.094 3.031 3.219 2.687 3.469 3.719 2.281 1.691 0.25 1.281 3.75 3.75 3.75 3.75 3.75 1.687 -1.156 3.312 3.281 3.219 2.969 2.969 2.719 1.5 1.5 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125</B>
        <A>-0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 4.331 4.331 -1.719 -1.062 0.188 -2.031 -1.719 0.313 -1.125 0.906 0.344 1.938 2.004 -0.75 2.688 -0.062 -0.094 2.688 -1.344 2.906 2.719 -2.125 -2.344 -1.625 2.469 -0.781 0.781 -0.062 -0.031 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125 -0.125</A>
      </Mlc>
    </Cp>
  </ControlPoints>
</SetBeam>

`

Так что в основном я могу перемещаться по структуре, которую я создал с помощью xml2struct, и могу извлекать значенияузлы, но я не мог выяснить, как я могу перейти, скажем, к узлу с текстом «2» и удалить весь узел перед узлом, у которого есть узел с текстом «2».Спасибо за любую помощь!

1 Ответ

0 голосов
/ 27 сентября 2018

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

Кроме того, удаление всего до определенной строки почти наверняка приведет к тому, что XML будет неправильно сформирован.

Если выЕсли вы хотите удалить все элементы <Cp>, которые предшествуют элементу с дочерним элементом <Mu>2</Mu>, вы можете сделать это в XSLT достаточно легко.Вам нужно одно правило, которое копирует все без изменений, которое в XSLT 3.0 можно записать

<xsl:mode on-no-match="shallow-copy"/>

, но в более ранних версиях требуется более подробное

<xsl:template match="*">
  <xsl:copy><xsl:copy-of select="@*"/><xsl:apply-templates/></xsl:copy>
</xsl:template>

, а затем второе правило, которое удаляетвыделенные элементы:

<xsl:template match="Cp[following-sibling::Cp/Mu='2']"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...