在这里,我们将给大家分享关于在JavaSimpleXML库中设置路径时,如何使用XML元素的值?的知识,让您更了解xml在java中怎么用的本质,同时也会涉及到如何更有效地java–在Android中
在这里,我们将给大家分享关于在Java SimpleXML库中设置路径时,如何使用XML元素的值?的知识,让您更了解xml在java中怎么用的本质,同时也会涉及到如何更有效地java – 在Android中使用Simple XML解析XML文件列表元素、java – 我可以使用SimpleXML来解析结构未知的XML吗?、Perl 用XML::Simple解析XML文件、perl使用xml::simple来读写xml的内容。
本文目录一览:- 在Java SimpleXML库中设置路径时,如何使用XML元素的值?(xml在java中怎么用)
- java – 在Android中使用Simple XML解析XML文件列表元素
- java – 我可以使用SimpleXML来解析结构未知的XML吗?
- Perl 用XML::Simple解析XML文件
- perl使用xml::simple来读写xml
在Java SimpleXML库中设置路径时,如何使用XML元素的值?(xml在java中怎么用)
我有以下XML:
<rdr> <details> <detail> <name>version</name> <value>15.0</value> </detail> <detail> <name>resolution</name> <value>1080X1920</value> </detail> </details></rdr>
我将其编组到以下Java bean中:
import org.simpleframework.xml.Element;import org.simpleframework.xml.Path;import org.simpleframework.xml.Root;@Root(name = "rdr", strict = false)public class XmlBean {@Path("details/detail[1]")@Element(name = "value")private String version;@Path("details/detail[2]")@Element(name = "value")private String resolution;public String getVersion() { return version;}public void setVersion(String version) { this.version = version;}public String getResolution() { return resolution;}public void setResolution(String resolution) { this.resolution = resolution;}}
我正在使用2.6.6版的简单XML实现此目的:http :
//simple.sourceforge.net/
但是,我想做的是使用XPath中的name元素。例如,我不是使用路径“ details / detail [1]”,而是使用“ details /
detail [name =
version]”。这不起作用,并且我得到org.simpleframework.xml.core.PathException:返回的路径异常无效索引。我已尝试将周围的版本替换为’,但无济于事。根据我对XPath的了解,这是正确的语法:http
:
//www.w3schools.com/xpath/xpath_syntax.asp
有人可以确认这看起来正确吗?
我已经研究了简单的xml库的源代码,它在不使用第三方库的情况下自行处理XPath处理。我知道为什么它不起作用,因为它只接受数字,并且会为所有非数字字符抛出该异常。
我很想修复该库,但是怀疑我做错了什么,可能还有其他应使用的注释或其他语法。
是否可以使用另一个注释来实现我要执行的操作?是否可以使用Simple做我想做的事情?
答案1
小编典典顺便说一句,我通过编写自己的库来解决此问题,该库可从此处获得:https : //github.com/aembleton/XML-
Marshaller
这非常简单和基本,但是当时解决了这个问题。
java – 在Android中使用Simple XML解析XML文件列表元素
我需要用SImple XML解析一个大的xml文件,(我真的想使用Simple XML).我使用XSD创建了对象,将它们从JAXB特定转换为特定于SimpleXML的对象.
XML看起来像这样:
<House>
<MainLevel Name="~#editRoom" IsHidden="false">
<ChildLevel Name="Television" Category="Livingroom">
<string>TestRoom</string>
</ChildLevel>
<ChildLevel Name="Chair" Category="Livingroom">
<string>TestRoom</string>
</ChildLevel>
<ChildLevel Name="Table">
<string>TestRoom</string>
</ChildLevel>
<ChildLevel Name="ChAmberName" Category="Livingroom">
<string>TestRoom</string>
</ChildLevel>
<ChildLevel Name="ChAmberName" Category="Bathroom">
<string>BathTub</string>
</ChildLevel>
<ChildLevel Name="Door", Category="DiningRoom">
<boolean>isOpen</boolean>
</ChildLevel>
</MainLevel>
<MainLevel Name="~#editRoom" IsHidden="false">
<ChildLevel Name="Television" Category="Livingroom">
<string>TestRoom</string>
</ChildLevel>
<ChildLevel Name="Chair" Category="Livingroom">
<string>TestRoom</string>
</ChildLevel>
<ChildLevel Name="Table" Category="Livingroom">
<string>TestRoom</string>
</ChildLevel>
<ChildLevel Name="ChAmberName" Category="Livingroom">
<string>TestRoom</string>
</ChildLevel>
<ChildLevel Name="ChAmberName" Category="Bathroom">
<string>BathTub</string>
</ChildLevel>
<ChildLevel Name="Door">
<boolean>isOpen</boolean>
</ChildLevel>
</MainLevel>
</House>
你有什么建议.请帮忙.Thx.
解决方法:
你最好写3个班:
> House类,(=根)包含MainLevel的(内联)列表
> MainLevel类,包含所有ChildLevel的(内联)列表
> ChildLevel类,包含值
这是一些伪代码:
@Root(...)
public class House
{
@ElementList(inline = true, ...)
private List<MainLevel> levels;
// ...
}
public class MainLevel
{
@Attribute(name = "Name")
private String name;
@Attribute(name = "IsHidden")
private bool hidden;
@ElementList(inline = true, ...)
private List<ChildLevel> childLevels;
// ...
}
public class ChildLevel
{
@Attribute(name = "Name")
private String name;
@Attribute(name = "Category", required = false)
private String category;
// ...
}
由于ChildLevel可以有不同的类型,因此您必须注意这一点.要么实现所有类型并将它们标记为不需要,要么创建子类.
java – 我可以使用SimpleXML来解析结构未知的XML吗?
我使用SimpleXML来解析通信协议中使用的小型XML文件.这一切都很好,但现在我正在实现协议的一部分,其中包括一种自由格式的XML.
例如,像这样的XML:
<telegram>
<config>
<foo>yes</foo>
<bar>no</bar>
</config>
</telegram>
foo和bar将来可能会发生变化,或者可能会添加一个元素baz,而无需触及解析代码.我想使用类似的结构在Java中访问这些元素
tree.getConfig().get("bar"); // returns "no"
我可以使用SimpleXML来解析它吗?我查看了文档,但找不到我需要的东西.
解决方法:
Can I use SimpleXML to parse that?
不是开箱即用 – 但写一个Converter就可以了.
@Root(name = "telegram")
@Convert(Telegram.TelegramConverter.class) // Requires AnnotationStrategy
public class Telegram
{
private Map<String, String> config;
public String get(String name)
{
return config.get(name);
}
public Map<String, String> getConfig()
{
return config;
}
// ...
@Override
public String toString()
{
return "Telegram{" + "config=" + config + '}';
}
static class TelegramConverter implements Converter<Telegram>
{
@Override
public Telegram read(InputNode node) throws Exception
{
Telegram t = new Telegram();
final InputNode config = node.getNext("config");
t.config = new HashMap<>();
// Iterate over config's child nodes and put them into the map
InputNode cfg = config.getNext();
while( cfg != null )
{
t.config.put(cfg.getName(), cfg.getValue());
cfg = config.getNext();
}
return t;
}
@Override
public void write(OutputNode node, Telegram value) throws Exception
{
// Implement if you need serialization too
throw new UnsupportedOperationException("Not supported yet.");
}
}
}
用法:
final String xml = "<telegram>\n"
+ " <config>\n"
+ " <foo>yes</foo>\n"
+ " <bar>no</bar>\n"
+ " <baz>maybe</baz>\n" // Some "future element"
+ " </config>\n"
+ "</telegram>";
/*
* The AnnotationStrategy is set here since it's
* necessary for the @Convert annotation
*/
Serializer ser = new Persister(new AnnotationStrategy());
Telegram t = ser.read(Telegram.class, xml);
System.out.println(t);
结果:
Telegram{config={bar=no, foo=yes, baz=maybe}}
Perl 用XML::Simple解析XML文件
在Perl中解析XML的方法最常见的就是使用 XML::DOM 和 XML::Simple了。 XML::DOM过于庞大,而且解析结果是一个DOM树,操作也不方便。
对于小型且不复杂的XML文件,XML::DOM真是杀鸡用牛刀。 这时就轮到轻便的XML::Simple上场了。
XML::Simple如其名,真的很简单。假设XML内容如下:
<opt>
<user login="grep" fullname="Gary R Epstein" />
<user login="stty" fullname="Simon T Tyson" >
<session pid="12345"/>
</user>
<text>This is a test.</text>
</opt>
那么只需这样写:
use XML::Simple;
use Data::Dumper;
$xml = XMLin(''sample.xml'');
print Dumper($xml);
就可以轻而易举地将XML解析成一个hash,然后用foreach依次处理即可。
$VAR1 = {
''text'' => ''This is a test.'',
''user'' => [
{
''fullname'' => ''Gary R Epstein'',
''login'' => ''grep''
},
{
''session'' => {
''pid'' => ''12345''
},
''fullname'' => ''Simon T Tyson'',
''login'' => ''stty''
}
]
};
可以发现如下规律:
- 元素的标签名被用于hash的key。
- 单个元素的内容作为hash的value,多个重复的元素的内容被放到一个数组引用中作为hash的value
- 属性和子元素都以hash的key=>value对出现在元素的内容中
一个问题是,对单个元素和多个重复元素的处理结果不一致,就会导致foreach处理时比较麻烦 (需要区分是标量还是数组引用),如上面的 text 和 user 的值。 解决方法是添加选项 ForceArray => 1,就可以强制单个元素也放到数组引用中。
$xml = XMLin(''sample.xml'', ForceArray => 1);
print Dumper($xml);
运行结果(部分):
$VAR1 = {
''text'' => [
''This is a test.''
],
''user'' => [
......
另一个问题是,如果你的元素属性中包含id、name或key,那么元素就不再放到数组引用中,而是放到 hash引用中。比如下面的XML,注意与上面的结果的区别:
<opt>
<user id="grep" fullname="Gary R Epstein" />
<user id="stty" fullname="Simon T Tyson">
<session pid="12345"/>
</user>
<text>This is a test.</text>
</opt>
$VAR1 = {
''text'' => [
''This is a test.''
],
''user'' => {
''grep'' => {
''fullname'' => ''Gary R Epstein''
},
''stty'' => {
''session'' => [
{
''pid'' => ''12345''
}
],
''fullname'' => ''Simon T Tyson''
}
}
};
user的内容不再是数组引用,而是hash引用,而id=''grep''也变成了key存在。
要想禁用这个功能,应当指定选项 KeyAttr => ''''。这个选项就是说,解析时应该把哪些属性作为hash的key来使用, 默认值是[''id'', ''name'', ''key'']。
在XML::Simple的文档中, 所有的选项都有详细说明,而KeyAttr和ForceArray选项被标为important,可见它们是多么常用了。
例如:
始终将testcases作为array; 将testcases下的retries作为testcases中的key;
my $ref_hash_result = XMLin($result_xml,
ForceArray => ["testcases"],
KeyAttr => {"testcases" => "retries"},
);
perl使用xml::simple来读写xml
一 读xml
1)xml实例
< employees >
< employee age = "30" >
< name > linux </ name >
< country > US </ country >
</ employee >
< employee age = "10" >
< name > mac </ name >
< country > US </ country >
</ employee >
< employee age = "20" >
< name > windows </ name >
< country > US </ country >
</ employee >
</ employees >
2)代码
use XML :: Simple;
use Data :: Dumper;
my $xmlfile = dirname($ 0 ) . " \\employees.xml " ;
if ( - e $xmlfile )
{
print " -----------------------------------------\n " ;
my $userxs = XML :: Simple -> new(KeyAttr => " name " );
my $userxml = $userxs -> XMLin( $xmlfile );
# print output
print Dumper( $userxml );
my %allemployees = % { $userxml -> {employee}};
foreach my $key ( keys ( %allemployees ))
{
print $key . " " ;
print $allemployees { $key }{ " age " } . " \n " ;
}
print " -----------------------------------------\n " ;
my $userxsT = XML :: Simple -> new(ForceArray => 1 );
my $userxmlT = $userxsT -> XMLin( $xmlfile );
# print output
print Dumper( $userxmlT );
my @allemployeeT = @{ $userxmlT -> { " employee " }};
foreach my $employee ( @allemployeeT )
{
print $employee -> { " name " }[ 0 ] . " " ;
print $employee -> { " age " } . " \n " ;
}
}
3)结果
二 写xml
代码:
use XML :: Simple;
use Data :: Dumper;
print " -----------------------------------------\n " ;
# create array
my @arr = [
{ ' country ' => ' england ' , ' capital ' => ' london ' } ,
{ ' country ' => ' norway ' , ' capital ' => ' oslo ' } ,
{ ' country ' => ' india ' , ' capital ' => ' new delhi ' } ];
# create object
my $xml = new XML :: Simple(NoAttr => 1 , RootName => ' daTaroot ' );
# convert Perl array ref into XML document
my $data = $xml -> XMLout( \ @arr , outputfile => " output1.xml " );
print " -----------------------------------------\n " ;
my $str =<< _XML_STRING_;
< config logdir = " /var/log/foo/ " debugfile = " /tmp/foo.debug " >
< server name = " sahara " osname = " solaris " osversion = " 2.6 " >
< address > 10.0 . 0.101 </ address >
< address > 10.0 . 1.101 </ address >
</ server >
< server name = " gobi " osname = " irix " osversion = " 6.5 " >
< address > 10.0 . 0.102 </ address >
</ server >
< server name = " kalahari " osname = " linux " osversion = " 2.0.34 " >
< address > 10.0 . 0.103 </ address >
< address > 10.0 . 1.103 </ address >
</ server >
</ config >
_XML_STRING_
my $xml_ref = XMLin( $str , KeepRoot => 1 );
my $xml_str = XMLout( $xml_ref , outputfile => " output2.xml " );
print " -----------------------------------------\n " ;
三 更多
常用参数:
xml-simple模块详细参考:http://search.cpan.org/~grantm/XML-Simple-2.18/lib/XML/Simple.pm
完!
关于在Java SimpleXML库中设置路径时,如何使用XML元素的值?和xml在java中怎么用的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于java – 在Android中使用Simple XML解析XML文件列表元素、java – 我可以使用SimpleXML来解析结构未知的XML吗?、Perl 用XML::Simple解析XML文件、perl使用xml::simple来读写xml等相关内容,可以在本站寻找。
本文标签: