GVKun编程网logo

在Java SimpleXML库中设置路径时,如何使用XML元素的值?(xml在java中怎么用)

9

在这里,我们将给大家分享关于在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 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文件列表元素

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吗?

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::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

perl使用xml::simple来读写xml

 

一 读xml

1)xml实例

<? xml version="1.0" encoding="UTF-8" ?>
< 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  File :: Basename;
use  XML :: Simple;
use  Data :: Dumper;

my   $xmlfile   =  dirname($ 0 .   " \\employees.xml " ;
if  ( - $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  File :: Basename;
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 " ;

 

 

三 更多

常用参数:

  • _[_list_]_#_in+out_-_important" rel="nofollow" target="_blank">KeyAttr => [ list ] # in+out - important or _{_list_}_#_in+out_-_important" rel="nofollow" target="_blank">KeyAttr => { list } # in+out - important  表示读取出来的dict中的key。
  • _1_#_in_-_important" rel="nofollow" target="_blank">ForceArray => 1 # in - important or _[_names_]_#_in_-_important" rel="nofollow" target="_blank">ForceArray => [ names ] # in - important  表示dict中的子元素表示为array,而不是dict。
  • _1_#_in+out_-_handy" rel="nofollow" target="_blank">NoAttr => 1 # in+out - handy 表示是否将子元素和属性都写为属性,读入时是否忽略属性。
  • _'string'_#_out_-_handy" rel="nofollow" target="_blank">RootName => 'string' # out - handy 表示写xml时的root节点名字。
  • _1_#_in+out_-_handy" rel="nofollow" target="_blank">KeepRoot => 1 # in+out - handy 表示是处理取root节点

     

    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等相关内容,可以在本站寻找。

    本文标签: