使用VTD-XML删除属性时如何修剪元素名称

时间:2018-03-15 19:41:43

标签: vtd-xml

给出以下xml片段

backup1=$(sudo cp /etc/udev/rules.d/999_usbdevices.rules /tmp/999_usbdevices.txt)
backup2=$(crontab -u pi -l> /tmp/crontab_backup.txt)

shell=$(stat -c%y /var/www/html/SIATA/crontab_backup)
ult_mod=$(stat -c%y /var/www/html/SIATA/crontab_backup)

shellUSB=$(stat -c%y /var/www/html/SIATA/999_usbdevices.rules)
ult_modUSB=$(stat -c%y /var/www/html/SIATA/999_usbdevices.rules)

while [ true ]; do
    actual=$(stat -c%y /var/www/html/SIATA/crontab_backup)
    actualUSB=$(stat -c%y /var/www/html/SIATA/999_usbdevices.rules)

       if [ "$ult_mod" != "$actual" ]
           then
               ult_mod=$(stat -c%y /var/www/html/SIATA/crontab_backup)
               shell=$(sudo crontab -u pi /var/www/html/SIATA/crontab_backup)
               delete=$(sudo rm /tmp/crontab_backup.txt)
               shell2=$(crontab -u pi -l> /tmp/crontab_backup.txt)
               echo $shell
               echo $shell2
       fi

       if [ "$ult_modUSB" != "$actualUSB" ]
           then
               ult_modUSB=$(stat -c%y /var/www/html/SIATA/999_usbdevices.rules)
               shellUSB=$(sudo cp /var/www/html/SIATA/999_usbdevices.rules /etc/udev/rules.d/999_usbdevices.rules)
               delete=$(sudo rm /tmp/999_usbdevices.txt)
               shell2USB=$(sudo cp /etc/udev/rules.d/999_usbdevices.rules '/tmp/999_usbdevices.txt')
               echo $shellUSB
               echo $shell2USB
       fi
   backup1=$(sudo cp /etc/udev/rules.d/999_usbdevices.rules /tmp/999_usbdevices.txt)
   backup2=$(crontab -u pi -l> /tmp/crontab_backup.txt)
done

使用VTD-XML删除命名空间属性可以很好地使用以下代码段:

<l:Variable xmlns="ddi:instance:3_2" xmlns:g="ddi:group:3_2" xmlns:l="ddi:logicalproduct:3_2" xmlns:r="ddi:reusable:3_2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <!-- some more content --!>
</l:Variable>

结果显示没有属性的元素但是之间的空白没有被删除:

private String removeNamespaces( String xml )
{
    try
    {
        VTDGen generator = new VTDGen();
        generator.setDoc( xml.getBytes() );
        generator.parse( false );
        VTDNav navigator = generator.getNav();
        XMLModifier xm = new XMLModifier( navigator );
        AutoPilot autoPilot = new AutoPilot( navigator );
        autoPilot.selectXPath( "@*" );
        int i = -1;
        while ((i = autoPilot.evalXPath()) != -1)
        {
            if ( navigator.toString( i ).startsWith( "xmlns" ) )
            {
                xm.removeAttribute( i );
            }
        }
        XMLByteOutputStream xbos = new XMLByteOutputStream( xm.getUpdatedDocumentSize() );
        xm.output( xbos );
        return new String( xbos.getXML() );
    }
    catch (Exception e)
    {
        throw new RuntimeException( e );
    }
}

<l:Variable > <!-- some more content --!> </l:Variable> 等的用法。不起作用,因为这些方法适用于元素,但不适用于属性。

总结一下:是否可以删除属性以获得结果,如

navigator.expandWhiteSpaces( l )

2 个答案:

答案 0 :(得分:1)

How to call Python function from NodeJS提示的启发,我的解决方法代码段现在是

while ((i = autoPilot.evalXPath()) != -1)
{
    xm.removeAttribute( i );
    xm.removeContent( navigator.getTokenOffset( i ) - 1, 1 );
}

这假设属性的前导空白属于它,因此也被删除。所有其他空白都被忽略并保持不变。

答案 1 :(得分:0)

首先,我认为您可以通过以下两种方式之一更简洁地编写“开始 - 编码”... 第一个使用starts-with()的xpath函数。它在技术上是一个xpath 2.0函数,但它们在vtd-xml的xpath实现中得到支持..以及contains()和ends-with()......

        generator.parse( false );
        VTDNav navigator = generator.getNav();
        XMLModifier xm = new XMLModifier( navigator );
        AutoPilot autoPilot = new AutoPilot( navigator );
        autoPilot.selectXPath( "@*[starts-with(.,'xmlns')]" );
        int i = -1;
        while ((i = autoPilot.evalXPath()) != -1)
        {
           // if ( navigator.toString( i ).startsWith( "xmlns" ) )
            //{
                xm.removeAttribute( navigator.trimWhiteSpaces(i) );
            //}
        }

或者您可以直接使用VTDNav的startWith,contains或endWith函数,而不是明确地将字符串对象存在(navigator.toString)

VTDNav navigator = generator.getNav();
        XMLModifier xm = new XMLModifier( navigator );
        AutoPilot autoPilot = new AutoPilot( navigator );
        autoPilot.selectXPath( "@*" );
        int i = -1;
        while ((i = autoPilot.evalXPath()) != -1)
        {
           // if ( navigator.toString( i ).startsWith( "xmlns" ) )
            //{
            if (navigator.startsWith(i, "xmlns"))
                xm.removeAttribute( i );
            //}
        }

无论哪种方式,我认为在属性名称 - 值对段上应用expandWhitespace可能有点危险,因为您可能会意外删除分隔的空格并弄乱格式正确的xml文档......

目前,清理丢失的白色空间是一项正在进行的工作。我希望它不是一个表演塞子。如果是,你将不得不手动完成...这将是一个有点乏味的编码。但你必须

  1. 找到属性名称值段

  2. 的开始和结束偏移量
  3. 将起始偏移量和长度编码为64位整数。

  4. 使用正确的参数调用trimWhitespace以删除末尾的无关空格......