给出以下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 )
答案 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文档......
目前,清理丢失的白色空间是一项正在进行的工作。我希望它不是一个表演塞子。如果是,你将不得不手动完成...这将是一个有点乏味的编码。但你必须
找到属性名称值段
将起始偏移量和长度编码为64位整数。
使用正确的参数调用trimWhitespace以删除末尾的无关空格......