在Matlab中查找和替换XML文件行

时间:2018-09-27 09:13:57

标签: xml matlab xml-parsing

我这里有一个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 :(得分:0)

行在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']"/>