我这里有一个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”的节点之前的整个节点。
感谢您的帮助!
答案 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']"/>