xml字符串转xml_XML的方法–第1部分– XML不是字符串…

xml字符串转xml

XML已经存在了很长时间:从内存来看,我猜到现在已经有12-14年的历史了。 从计算的角度来看,它是一种成熟的产品,具有悠久的历史。 那么,有什么我可以添加到该主题的新东西吗? XML的处理方式实际上取决于您和您的情况,重点是 情况 。 在一个极端情况下,您可能会参与一个舒适的“内部”项目,其中一个内部系统必须与另一个系统对话。 在另一种极端情况下,您处于一种XML模式下,这种模式将有一天包含系统和其他国家/地区的其他系统之间的对话,这些对话是由一组不同的开发人员编写的。

像往常一样,为了演示XML的不同方法,我将采用一个完全人为和令人发指的方案,在这种情况下,您正在为Pete的Perfect Pizza 1工作 ,这是一条在高街上有点外卖的商店,但是皮特有很大的想法,他要做的第一件事就是自动将前台的订单发送到厨房,他要您编写一些代码。 您的大主意是为此使用XML,然后匆匆将您的主意写下来,并与Pete达成一致……

<?xml version='1.0' encoding='UTF-8'?>
<pizza>
    <name>Capricciosa</name>
    <base>thin</base>
    <quantity>2</quantity>
</pizza>

Pete's是一家非常小的公司,您最终需要对前台消息生成器和厨房XML解析器代码进行编码。 这是您第一次尝试XML,并为您提供了厨房解析器代码:

public class OrderPizza {



  private String pizzaName;

  private String base;

  private String quantity;



  public void order(String xmlOrder) {



    pizzaName = xmlOrder.substring(57, xmlOrder.indexOf('</', 58));

    int index = xmlOrder.indexOf('<base>', 58);

    int index2 = xmlOrder.indexOf('</', index);

    base = xmlOrder.substring(index + 6, index2);

    index = xmlOrder.indexOf('<quantity>', index2);

    index2 = xmlOrder.indexOf('</', index);

    quantity = xmlOrder.substring(index + 10, index2);

  }



  public String getPizzaName() {

    return pizzaName;

  }



  public String getBase() {

    return base;

  }



  public String getQuantity() {

    return quantity;

  }

}

…在单元测试中效果很好:

public class OrderPizzaTest {



  private static final String ORDER_XML = //

  '<?xml version=\'1.0\' encoding=\'UTF-8\'?>\n' + // 

      '<pizza>\n' + //

      '    <name>Capricciosa</name>\n' + // 

      '    <base>thin</base>\n' + //

      '    <quantity>2</quantity>\n' + //

      '</pizza>\n';



  private OrderPizza instance;



  @Before

  public void setUp() throws Exception {



    instance = new OrderPizza();

  }



  @Test

  public void readOrderFromXML() {



    instance.order(ORDER_XML);



    assertEquals('Capricciosa', instance.getPizzaName());

    assertEquals('thin', instance.getBase());

    assertEquals('2', instance.getQuantity());

  }

}

它上线了,一切都很好…。

时间流逝, Pete的Perfect Pizza开始扩大。 前台应用程序需要进行一些调整,Pete会加入另一个开发人员。 新开发人员要做的第一件事是确定摆脱XML消息中的空白字符并向厨房发送类似以下代码的效率更高:

<?xml version='1.0' encoding='UTF-8'?><pizza><name>Capricciosa</name><base>thin</base><quantity>2</quantity></pizza>

厨房代码很快就会掉下来,您意识到在处理XML时犯了第一个也是最基本的错误,因为XML不是STRING。 XML是一种面向对象的文档模型,可以使用字符串表示形式进行显示-这是很多人都学到的硬道理。 不仅是字符串的漂亮印刷可以使您绊倒,还有很多文件格式的恶作剧还在继续。 以www.sitemaps.org为例。 该网站定义了Google,Yahoo!和Microsoft支持的XML模式,并允许网站管理员向搜索引擎通知其网站上可使用XML文档进行爬网的页面。 考虑到在模式中使用了命名空间,当要求其提供站点地图时,网站可以返回如下内容:

<?xml version='1.0' encoding='UTF-8'?>
<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'
xsi:schemaLocation='http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'>
   <url>
      <loc>http://www.example.com/</loc>
      <lastmod>2005-01-01</lastmod>
      <changefreq>monthly</changefreq>
      <priority>0.8</priority>
   </url>
   <url>
      <loc>http://www.example.com/page1/</loc>
      <lastmod>2006-01-02</lastmod>
      <changefreq>weekly</changefreq>
      <priority>0.8</priority>
   </url>
</urlset>

…但是它可以同样返回:

<?xml version='1.0' encoding='UTF-8'?>
<sm:urlset xmlns:sm='http://www.sitemaps.org/schemas/sitemap/0.9'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:schemaLocation='http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'>
   <sm:url>
      <sm:loc>http://www.example.com/</sm:loc>
      <sm:lastmod>2005-01-01</sm:lastmod>
      <sm:changefreq>monthly</sm:changefreq>
      <sm:priority>0.8</sm:priority>
   </sm:url>
   <sm:url>
      <sm:loc>http://www.example.com/page1/</sm:loc>
      <sm:lastmod>2006-01-02</sm:lastmod>
      <sm:changefreq>weekly</sm:changefreq>
      <sm:priority>0.8</sm:priority>
   </sm:url>
</sm:urlset>

…或这个:

<?xml version='1.0' encoding='UTF-8'?>
<sitemap:urlset xmlns:sitemap='http://www.sitemaps.org/schemas/sitemap/0.9'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:schemaLocation='http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'>
   <sitemap:url>
      <sitemap:loc>http://www.example.com/</sitemap:loc>
      <sitemap:lastmod>2005-01-01</sitemap:lastmod>
      <sitemap:changefreq>monthly</sitemap:changefreq>
      <sitemap:priority>0.8</sitemap:priority>
   </sitemap:url>
   <sitemap:url>
      <sitemap:loc>http://www.example.com/page1/</sitemap:loc>
      <sitemap:lastmod>2006-01-02</sitemap:lastmod>
      <sitemap:changefreq>weekly</sitemap:changefreq>
      <sitemap:priority>0.8</sitemap:priority>
   </sitemap:url>
</sitemap:urlset>

…它们都是有效的,等效的,并且包含相同的信息。 只是它们的字符串表示形式有所不同并且放在一起,它们强调了XML的第一条规则,即XML不是STRING。

回到Pete的Perfect Pizza ,您想知道当Pete进来并要求增强功能时,如何解决您的代码。 他希望您改进系统,以便您的XML文档一次可以订购多个披萨。 您意识到字符串处理已经出来了,并且在Internet上遇到了SAX解析,但是在另一时间却更多。

1使用Google,您会发现全球有四页的Pete's Perfect Pizza价值。 这个故事是虚构的,与它们的任何相似之处纯属巧合。
2通过阅读订单XML,您可能会猜到我最喜欢的披萨是Capricciosa, Pizza Margherita提供了有史以来最好的披萨

可从GitHub上获得源代码:

git://github.com/roghughe/captaindebug.git

继续阅读本系列的第2部分

参考: XML的方法–第1部分– XML不是字符串…来自Captain Debug的Blog博客中的JCG合作伙伴 Roger Hughes。


翻译自: https://www.javacodegeeks.com/2012/07/approaches-to-xml-part-1-xml-is-not.html

xml字符串转xml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用JAXB(Java Architecture for XML Binding)来实现XML字符串Java对象之间的换。 1. 将Java对象换为XML字符串 使用JAXB的Marshaller类可以将Java对象换为XML字符串。以下是一个示例代码: ```java // 创建JAXBContext对象 JAXBContext jaxbContext = JAXBContext.newInstance(Student.class); // 创建Marshaller对象 Marshaller marshaller = jaxbContext.createMarshaller(); // 设置Marshaller的属性 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 将Java对象换为XML字符串 Student student = new Student("Tom", 18); StringWriter writer = new StringWriter(); marshaller.marshal(student, writer); String xmlString = writer.toString(); System.out.println(xmlString); ``` 2. 将XML字符串换为Java对象 使用JAXB的Unmarshaller类可以将XML字符串换为Java对象。以下是一个示例代码: ```java // 创建JAXBContext对象 JAXBContext jaxbContext = JAXBContext.newInstance(Student.class); // 创建Unmarshaller对象 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); // 将XML字符串换为Java对象 String xmlString = "<student><name>Tom</name><age>18</age></student>"; StringReader reader = new StringReader(xmlString); Student student = (Student) unmarshaller.unmarshal(reader); System.out.println(student.getName() + ", " + student.getAge()); ``` 需要注意的是,在将Java对象换为XML字符串和将XML字符串换为Java对象时,都需要先创建JAXBContext对象。JAXBContext是线程安全的,因此建议在应用程序启动时创建一次即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值