我的XML结构如下:
<Children>
<Stand>
<Basics>
<Attribute Name="Name">User1</Attribute>
<Attribute Name="Scope">LOCAL</Attribute>
</Basics>
<Attributes/>
<Relationship>
<Attribute Name="Quantity">2</Attribute>
<Attribute Name="good Quantity">0</Attribute>
</Relationship>
</Stand>
<Stand>
<Basics>
<Attribute Name="Name">User2</Attribute>
<Attribute Name="Scope">LOCAL</Attribute>
</Basics>
<Attributes/>
<Relationship>
<Attribute Name="Quantity">5</Attribute>
<Attribute Name="good Quantity">0</Attribute>
</Relationship>
</Stand>
</Children>
我想从上面的XML中提取Name
,Scope
,Quantity
和good Quantity
。我正在使用Xpath表达式:
//Children/Stand/* [self::Basics | self::Relationship]
我得到的结果是:
User1 LOCAL null null
null null 2 0
User2 LOCAL null null
null null 5 0
我希望结果如下:
User1 LOCAL 2 0
User2 LOCAL 5 0
任何人都可以帮助获得所需的输出吗?
答案 0 :(得分:1)
我相信这个问题除了xpath之外还有别的东西,因为xpath只能返回节点或像字符串一样的原始类型,类似于那样,而不是表结构化的结果。
在仅xpath的观点上,您当前的xpath选择<Basics>
和<Relationship>
元素,每个元素都在结果表的单独行中。我相信您希望xpath选择<Stand>
元素:
//Children/Stand
然后相对于当前<Stand>
元素进行列选择:
Basics/Attribute[@Name="Name"]
Basics/Attribute[@Name="Scope"]
Relationship/Attribute[@Name="Quantity"]
Relationship/Attribute[@Name="good Quantity"]
这样,对应于同一<Attribute>
祖先的所有<Stand>
元素都显示在结果表的同一行中。
答案 1 :(得分:1)
您是否考虑过应用脚本语言?因为我所做的就是这样,在var visibleRect =
CGRectMake (newImageVC.scrollView.contentOffset.x * scale,
newImageVC.scrollView.contentOffset.y * scale,
newImageVC.scrollView.bounds.size.width * scale,
newImageVC.scrollView.bounds.size.height * scale)
中使用相当优秀的perl
库进行XML解析。
XML::Twig
或者,如果您更喜欢更简洁(并假设属性以相同的方式排序):
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
sub print_user {
my ( $twig, $stand ) = @_;
print join( "\t",
$stand->get_xpath( './Basics/Attribute[@Name="Name"]', 0 )->text,
$stand->get_xpath( './Basics/Attribute[@Name="Scope"]', 0 )->text,
$stand->get_xpath( './Relationship/Attribute[@Name="Quantity"]', 0 )->text,
$stand->get_xpath( './Relationship/Attribute[@Name="good Quantity"]', 0 )
->text,
),
"\n";
}
XML::Twig->new( 'twig_handlers' => { 'Stand' => \&print_user } ) -> parsefile ('xmlfile');