[CareerCup] 17.10 Encode XML 编码XML

17.10 Since XML is very verbose, you are given a way of encoding it where each tag gets mapped to a pre-defined integer value. The language/grammar is as follows:

Element --> Tag Attributes END Children END
Attribute --> Tag Value
END --> 0
Tag --> some predefined mapping to int
Value --> string value END

For example, the following XML might be converted into the compressed string below (assuming a mapping of famiLy -> l, person ->2, frstName ->3, LastName -> 4j state -> 5).

<family lastName="McDowell" state="CA">
<person firstName="Gayle">Some Message</person>
</family>

Becomes:

1 4 McDowell 5 CA 0 2 3 Gayle 0 Some Message 0 0

Write code to print the encoded version of an XML element (passed in E Lament and Attribute objects).

这道题让我们给XML编码,那么我们可以用OOD的方法来实现,建立Attribute类和Element类,其中一个Element中可以包含多个Attribute,然后就是写encode函数,我们可以利用重载特性来写多个encode函数,需要注意的是,在encode到字符串中包含0的时候需要特殊处理,因为题目中说END都要换成0,为了不引起歧义,我们在字符串中出现0的地方前面都加一个\,变成\0,但是\0又表示空格,所以我们需要把所有的0变成\\0,可以用v = v.replace("0", "\\0"); 不得不说的是Java中对字符串的处理实在太强大了,集成了诸如replace, trim, split这样方便又常用的函数,而C++的STL却木有这些功能函数,还是Java叼啊。

public class Attribute {
    public String tag;
    public String value;

    public Attribute(String t, String v) {
        tag = t;
        value = v;
    }

    public String getTagCode() {
        if (tag == "family") {
            return "1";
        } else if (tag == "person") {
            return "2";
        } else if (tag == "firstName") {
            return "3";
        } else if (tag == "lastName") {
            return "4";
        } else if (tag == "state") {
            return "5";
        }
        return "--";
    }
}

import java.util.ArrayList;

public class Element {
    public ArrayList<Attribute> attributes;
    public ArrayList<Element> children;
    public String name;
    public String value;

    public Element(String n) {
        name = n;
        attributes = new ArrayList<Attribute>();
        children = new ArrayList<Element>();
    }

    public Element(String n, String v) {
        name = n;
        value = v;
        attributes = new ArrayList<Attribute>();
        children = new ArrayList<Element>();
    }

    public String getNameCode() {
        if (name == "family") {
            return "1";
        } else if (name == "person") {
            return "2";
        } else if (name == "firstName") {
            return "3";
        } else if (name == "lastName") {
            return "4";
        } else if (name == "state") {
            return "5";
        }
        return "--";
    }

    public void insert(Attribute attribute) {
        attributes.add(attribute);
    }

    public void insert(Element child) {
        children.add(child);
    }
}

public class j {
    public static void encode(String v, StringBuffer sb) {
        v = v.replace("0", "\\0");
        sb.append(v);
        sb.append(" ");
    }

    public static void encodeEnd(StringBuffer sb) {
        sb.append("0");
        sb.append(" ");
    }

    public static void encode(Attribute attr, StringBuffer sb) {
        encode(attr.getTagCode(), sb);
        encode(attr.value, sb);
    }

    public static void encode(Element root, StringBuffer sb) {
        encode(root.getNameCode(), sb);
        for (Attribute a : root.attributes) {
            encode(a, sb);
        }
        encodeEnd(sb);
        if (root.value != null && root.value != "") {
            encode(root.value, sb);
        } else {
            for (Element e : root.children) {
                encode(e, sb);
            }
        }
        encodeEnd(sb);
    }

    public static String encodeToString(Element root) {
        StringBuffer sb = new StringBuffer();
        encode(root, sb);
        return sb.toString();
    }

    public static void main(String args[]) {
        Element root = new Element("family");
        Attribute a1 = new Attribute("lastName", "0");
        Attribute a2 = new Attribute("state", "CA");
        root.insert(a1);
        root.insert(a2);

        Element child = new Element("person", "Some Message");
        Attribute a3 = new Attribute("firstName", "Gayle");
        child.insert(a3);

        root.insert(child);

        String s = encodeToString(root);
        System.out.println(s);
    }
}

CareerCup All in One 题目汇总

时间: 2024-10-24 22:38:40

[CareerCup] 17.10 Encode XML 编码XML的相关文章

boost读取utf-8编码xml文件

参照:http://www.cnblogs.com/qicosmos/p/3555668.html 解决boost读取utf-8 xml文件乱码问题. 代码如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 void io::read(const string& file) {     try     {         wifstream f(file);         locale utf8Locale(locale("chs&quo

thinkphp xml编码函数

/** * XML编码 * @param mixed $data 数据 * @param string $root 根节点名 * @param string $item 数字索引的子节点名 * @param string $attr 根节点属性 * @param string $id 数字索引子节点key转换的属性名 * @param string $encoding 数据编码 * @return string */ function xml_encode($data, $root='think

hadoop三个配置文件的参数含义说明core-site.xml,hdfs-site.xml,mapred-site.xml

配置hadoop,主要是配置core-site.xml,hdfs-site.xml,mapred-site.xml三个配置文件,默认下来,这些配置文件都是空的,所以很难知道这些配置文件有哪些配置可以生效,上网找的配置可能因为各个hadoop版本不同,导致无法生效.浏览更多的配置,有两个方法: 1.选择相应版本的hadoop,下载解压后,搜索*.xml,找到core-default.xml,hdfs-default.xml,mapred-default.xml,这些就是默认配置,可以参考这些配置的

C# XML 输出xml根节点的第二级子节点的名字

1 xml 1 <?xml version="1.0" encoding="utf-8" ?> 2 <cultures> 3 <daojia> 4 <book> 5 <name> 道德经</name> 6 <author>老子</author> 7 </book> 8 <book> 9 <name> 文始真经</name>

C#操作Xml:linq to xml操作XML

LINQ to XML提供了更方便的读写xml方式.前几篇文章的评论中总有朋友提,你为啥不用linq to xml?现在到时候了,linq to xml出场了. .Net中的System.Xml.Linq命名空间提供了linq to xml的支持.这个命名空间中的XDocument,XElement以及XText,XAttribute提供了读写xml文档的关键方法. 1. 使用linq to xml写xml: 使用XDocument的构造函数可以构造一个Xml文档对象:使用XElement对象可

【XML】——XML与HTML异同

在没有学习XML之前,一直错认为XML是HTML的替代语言,在看<XML刘伟>视频之后,发现这种认为 对我的帮助还是挺大的.现在来更正一下XML语言与HTML的关系,然后再说说为什么错觉也会有帮助. 什么是标记语言? 是一种将文本以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码. 与文本相关的其他信息(包括文本的结构和表示信息等)与原来的文本结合在一起,但是使用标记进行标识. 标记语言有: 这么多标记语言里我们现在接触的就HTML与XML,但是触类旁通,只要把这两

【译】Attacking XML with XML External Entity Injection (XXE)

原文链接:Attacking XML with XML External Entity Injection (XXE) XXE:使用XML外部实体注入攻击XML 在XML中,有一种注入外部文件的方式.长久以来,自动XML解析器(在后端使用libxml2)默认启用.因此,使用XML来格式化和传递数据的站点是存在漏洞的. XML经常被这样使用,一些常规的猜想是一些API发起SOAP请求和Javascript / Ajax使用XML传递数据. 建立你的测试平台 对于基于web的攻击,我喜欢在Mutil

JavaScript之Ajax-3 XML语法(XML概述、基本语法)

一.XML概述 XML概述 - XML 是可扩展标记语言(eXtensible Markup Language) - XML 是一种标记语言,类似于HTML - XML 的设计宗旨是传输数据,尔非现实数据 - XML 的标签没有被预定义,需要自行定义 - XML 是W3C的推荐标准 XML用途 - XML 应用于web开发的许多方面,常用于简化数据的存储和共享 - XML 可以将数据从 HTML 中分离出来 - XML 可以简化数据共享 - XML 可以简化数据传输 二.基本语法 XML声明 -

Android中序列化对象到XMl 和 XML反序列化为对象

package com.example.xmloperation; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import java.util.Random; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; imp