庞果(pongo) 蓝港在线:xml字符串文件的解析

本文介绍了蓝港在线技术团队提出的一个挑战,即编写程序解析XML字符串文件,要求不依赖任何开源库。题目详细描述了XML文件的输入格式和输出格式,并给出了C++、Java和C#的函数原型。解答者强调了这个问题实际上是一个简单的词法分析器实现,并对此表达了看法。

首先是题目详情

蓝港在线:xml字符串文件的解析

题目详情:


本题来自蓝港在线技术团队的idea,详情如下:

XML-可扩展标记语言 ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,被广泛的运用于数据传输和存储。请编写一段程序,不使用语言之外的开源库,解析对应的XML文件,并格式化后在屏幕上打印出来。


举个例子如下,当给定下述XML文件时:

<?xml version="1.0" ?>

<Books>

<Book>

<Name = “The C++ Programming Language” Author=”Bjarne Stroustrup” />

</Book>

<Book>

<Name = “Effective C++” Author = “Scott Meyers” />

</Book>

</Books>

它对应的输出应该是:

Books

 Book 1

     Name:The C++ Programming Language

     Author:Bjarne Stroustrup

 Book 2

     Name:Effective C++

     Author:Scott Meyers


输入:简化的一段xml文件,用字符串表示,如下(属性名字不包含引号和等号,也不包含大于小于等特殊字符,详细规则见下面的答题说明)

string in = "<?xml version=\"1.0\" ?><Books><Book><Name = \"The C++ Programming Language\" Author=\"Bjarne Stroustrup\" /></Book><Book><Name = \"Effective C++\" Author = \"Scott Meyers\" /></Book></Books>";

输出:对输入的xml字符串解析,得到输出如下:

string out = "Books\r\n\tBook 1\r\n\t\tName:The C++ Programming Language\r\n\t\tAuthor:Bjarne Stroustrup\r\n\tBook 2\r\n\t\tName:Effective C++\r\n\t\tAuthor:Scott Meyers";


函数原型:

C++   ParsingXML(string in);

Java   ParsingXML(String in);

C#    ParsingXML(string input)

答题说明:


1、xml分为三级,一级为大类,二级为实体,三级为属性

2、三级之间用换行间隔,每级间开始用缩格。

3、二级对象后间隔一个空格,并输出对象所在xml中的顺序号

4、第三级顺序输出属性名称和属性值,属性名和属性值间用:间隔

5、输入格式:

输入为单一xml格式字符串,其中带有"字符。可能带有回车换行符。

6、输出格式:

输出数据中不带"字符,输出格式中的每行开头使用Tab字符作为缩进。

7、属性名字不包含引号和等号,不包含大于小于等特殊字符。

8、不能使用语言之外的开源库。



这题就是写一个简单xml解析,归根结底是手写一个简单词法分析器。不多说,上通过代码。这种东西不应该出现在庞果英雄会上。。。。

public class XMLParse
{ 
   public static String ParsingXML(String in)
   {
        char[] c = in.toCharArray();
        Lexer t = new Lexer(c);
        StringBuffer r = new StringBuffer();
        Token to = t.next();
        if(to.type == TokenType.EOF){
            return null;
        }
        r.append(to.name);
        int j = 1;
        while (t.has_next()) {
            Token s = t.next();
            if(s.type == TokenType.ARRT){
                r.append("\r\n\t"+s.name+" "+(j++));
            }else if(s.type == TokenType.VALUE){
                r.append("\r\n\t\t"+s.name);
            }
        }
        return r.toString();
    }    

    //start 提示:自动阅卷起始唯一标识,请勿删除或增加。 
    public static void main(String args[]) 
    { 
        String in =  "<?xml version=\"1.0\" ?>\r\n<Books></Books>";
        String out = ParsingXML(in);    
        System.out.println(out);

    } 
    //end //提示:自动阅卷结束唯一标识,请勿删除或增加。
}
class Token {
    
    public Token(TokenType type, String name) {
        this.type = type;
        this.name = name;
    }
    
    public TokenType type;
    public String    name;
    public String toString(){
        return type+":"+name;
    }
}

enum TokenType {
    ROOT, ARRT, VALUE,UNEXCEPT,EOF;
}

class Lexer {
    
    private char[] c;
    int            index = 0;
    char           p;
    
    public Lexer(char[] c) {
        this.c = c;
    }
    
    public char readc() {
        if(index >= c.length){
            return 0;
        }
        return c[index++];
    }
    
    public boolean has_next() {
        return index < c.length;
    }
    
    public Token next() {
        p = readc();
        if(p == 0){
            return new Token(TokenType.EOF, "EOF");
        }
        while (true) {
            if (p == ' ' || p == '\r' || p == '\n' || p == '\t') {
                p = readc();
            }
            else {
                break;
            }
        }
        if (p == '<') {
            return next();
        }
        else if (p == '?') {
            while (p != '>') {
                //NOP
                p = readc();
            }
            return next();
        }
        else if (Character.isLetter(p)) {
            StringBuffer s = new StringBuffer();
            while (Character.isLetter(p)) {
                s.append(p);
                p = readc();
            }
            while (true) {
                if (p == ' ' || p == '\r' || p == '\n' || p == '\t') {
                    p = readc();
                }
                else {
                    break;
                }
            }
            if(p == '>'){
                return new Token(TokenType.ARRT,s.toString());
            }else if(p == '='){
                p = readc();
                s.append(":");
            }
            while (true) {
                if (p == ' ' || p == '\r' || p == '\n' || p == '\t') {
                    p = readc();
                }
                else {
                    break;
                }
            }
            if (p == '"') {
                p = readc();
                while (p != '"') {
                    s.append(p);
                    p = readc();
                }
                return new Token(TokenType.VALUE,s.toString());
            }
        }
        else if (p == '/') {
            StringBuffer s = new StringBuffer();
            p = readc();
            if (Character.isLetter(p)) {
                while (p != '>') {
                    s.append(p);
                    p = readc();
                }
                if(has_next()){
                    return next();
                }else{
                    return new Token(TokenType.EOF, "EOF");
                }
            }
            else {
                return next();
            }
        }
        return new Token(TokenType.UNEXCEPT, "EOF");
    }
    
}


内容概要:本文围绕“考虑电动汽车聚合可调节能力的含波动性电源电氢耦合系统多目标优化运行”展开研究,提出了一种基于Matlab代码实现的多目标优化模型。该模型深度融合电-氢耦合系统与高比例波动性可再生能源(如风电、光伏),充分挖掘电动汽车(EV)集群作为移动储能单元的灵活调节潜力,通过聚合调控提升系统对新能源的消纳能力与运行经济性。研究系统构建了电动汽车可调度能力、电解水制氢与储氢动态过程、多能源协同互补的优化调度框架,并结合智能优化算法实现经济性、低碳性与运行稳定性等多重目标的协同优化。文中配套提供了完整的Matlab仿真代码、相关数据及可能的论文支撑材料,极大地方便了模型的复现、验证与后续深化研究。; 适合人群:具备电力系统、综合能源系统、优化理论或新能源技术等相关领域基础知识的研究生、科研人员,以及从事新型电力系统规划、清洁能源消纳与智慧能源管理的工程技术人员。; 使用场景及目标:①开展高渗透率可再生能源接入下的综合能源系统多目标优化调度研究;②探究电动汽车集群在电网削峰填谷、平抑新能源出力波动及提供辅助服务方面的应用价值与潜力;③学习并掌握电氢耦合系统的建模方法、多目标优化求解技术及其在Matlab/Simulink环境下的仿真实现流程。; 阅读建议:此资源不仅提供可运行的代码,更蕴含了前沿的科研思路与创新方法,建议读者结合所提供的代码、数据与可能的论文文档,系统性地学习从问题建模、算法设计到仿真分析的完整科研过程,并重点关注其中关于需求侧资源聚合、多能互补协同与绿色低碳运行的核心理念。
内容概要:本文档名为《经济学期刊论文复现:数字化转型能促进企业的高质量发展吗》,表面上聚焦于经济学领域中数字化转型对企业高质量发展影响的研究,实则是一份涵盖多学科交叉的科研仿真代码资源合集。资源以Matlab、Simulink、Python为主要工具,系统整合了电力系统仿真、微电网优化调度、路径规划、信号处理、图像处理、机器学习预测模型等方向的可复现算法与仿真模型。尽管标题指向经济学实证分析,但内容重心在于提供顶级期刊论文的复现代码,如企业全要素生产率(TFP)测算方法(OL、FE、LP、OP、GMM)、风光储氢系统优化、需求响应与综合能源系统调度等,并融合智能优化算法与深度学习技术进行数据建模与预测分析,体现出极强的工程化与科研实用性。; 适合人群:具备一定编程基础,熟练掌握Matlab/Simulink/Python等仿真工具,从事工程仿真、经济实证研究或交叉学科科研工作的研究生、高校教师及科研人员。; 使用场景及目标:① 复现经济学顶刊论文中的计量经济模型,深入探究数字化转型对企业全要素生产率的影响机制;② 借助提供的代码资源开展电力系统故障仿真、微电网优化、多能系统调度等科研项目的算法验证与仿真分析;③ 应用机器学习与深度学习模型完成负荷预测、风电光伏出力预测、电池健康状态评估等典型实证任务; 阅读建议:此资源虽冠以经济学论文之名,实质为多领域高价值仿真代码集成,建议读者依据自身研究方向筛选适配内容,优先关注“顶刊复现”“论文复现”类项目,结合配套数据与代码进行实证推演,并通过公众号“荔枝科研社”获取完整资料与持续技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值