XML的方法–第1部分– 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博客博客中的JCG合作伙伴 Roger Hughes。


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用多种方式将XML字符串转换成JSON字符串,或将JSON字符串转换成XML字符串。以下是一些常用的方法: 1. 使用第三方库 常用的XML和JSON转换库有:jackson、Gson、xmlpull、xmlbeans、dom4j、jdom等。这些库提供了各种将XML和JSON字符串互相转换的方法。例如,使用Jackson库将XML字符串转换为JSON字符串: ```java import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; String xmlString = "<person><name>John</name><age>30</age></person>"; // 将XML字符串转换为Java对象 XmlMapper xmlMapper = new XmlMapper(); Object obj = xmlMapper.readValue(xmlString, Object.class); // 将Java对象转换为JSON字符串 ObjectMapper jsonMapper = new ObjectMapper(); String jsonString = jsonMapper.writeValueAsString(obj); System.out.println(jsonString); ``` 输出结果为: ```json {"person":{"name":"John","age":"30"}} ``` 2. 手动转换 也可以手动编写代码将XML和JSON字符串互相转换。例如,使用Java内置的XML DOM API将XML字符串转换为JSON字符串: ```java import org.json.JSONObject; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.util.HashMap; import java.util.Map; String xmlString = "<person><name>John</name><age>30</age></person>"; // 将XML字符串解析为DOM对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new InputSource(new StringReader(xmlString))); // 将DOM对象转换为JSON对象 JSONObject json = new JSONObject(); Element root = doc.getDocumentElement(); if (root.hasChildNodes()) { NodeList nodeList = root.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; Map<String, String> map = new HashMap<>(); if (element.hasAttributes()) { for (int j = 0; j < element.getAttributes().getLength(); j++) { map.put(element.getAttributes().item(j).getNodeName(), element.getAttributes().item(j).getNodeValue()); } } if (element.hasChildNodes()) { json.put(element.getNodeName(), element.getTextContent()); } else if (!map.isEmpty()) { json.put(element.getNodeName(), new JSONObject(map)); } } } } System.out.println(json.toString()); ``` 输出结果为: ```json {"person":{"name":"John","age":"30"}} ``` 3. 使用XPath表达式 我们还可以使用XPath表达式从XML中提取数据,并将其转换为JSON格式。例如,使用Java内置的XPath API将XML字符串转换为JSON字符串: ```java import org.json.JSONObject; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathFactory; import java.io.StringReader; String xmlString = "<person><name>John</name><age>30</age></person>"; // 创建XPath对象 XPathFactory xPathfactory = XPathFactory.newInstance(); XPath xpath = xPathfactory.newXPath(); // 编译XPath表达式 XPathExpression expr = xpath.compile("/*"); // 将XML字符串解析为DOM对象 InputSource source = new InputSource(new StringReader(xmlString)); NodeList nodes = (NodeList) expr.evaluate(source, XPathConstants.NODESET); // 将DOM对象转换为JSON对象 JSONObject json = new JSONObject(); for (int i = 0; i < nodes.getLength(); i++) { Node node = nodes.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; if (element.hasChildNodes()) { json.put(element.getNodeName(), element.getTextContent()); } } } System.out.println(json.toString()); ``` 输出结果为: ```json {"person":{"name":"John","age":"30"}} ``` 注意:以上示例仅供参考,实际使用时需要根据具体情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值