首页 \ 问答 \ 解析xml DTD文件(Parser for xml DTD file)

解析xml DTD文件(Parser for xml DTD file)

我是一个很新的实现解析器,我正在尝试解析一个xml DTD文件,为它生成一个上下文无关语法。 我尝试过pyparsing和yacc,但我仍然能得到任何结果。 所以如果有人可以提供一些技巧或示例代码来编写这样的解析器,我将不胜感激。 以下是DTD文件示例:

<!DOCTYPE PcSpecs [
<!ELEMENT PCS (PC*)>
<!ELEMENT PC (MODEL, PRICE, PROCESSOR, RAM, DISK+)>
<!ELEMENT MODEL (\#PCDATA)>
<!ELEMENT PRICE (\#PCDATA)>
<!ELEMENT PROCESSOR (MANF, MODEL, SPEED)>
<!ELEMENT MANF (\#PCDATA)>
<!ELEMENT MODEL (\#PCDATA)>
<!ELEMENT SPEED (\#PCDATA)>
<!ELEMENT RAM (\#PCDATA)>
<!ELEMENT DISK (HARDDISK | CD | DVD)>
<!ELEMENT HARDDISK (MANF, MODEL, SIZE)>
<!ELEMENT SIZE (\#PCDATA)>
<!ELEMENT CD (SPEED)>
<!ELEMENT DVD (SPEED)>
]>

提前致谢。


I am quite new in implementing a parser and I am trying to pars a xml DTD file to generate a context free grammar for it. I tried pyparsing and yacc but still I could get any result. So I would appreciate if some one could provide me some tips or sample code to write such a parser. following is a sample DTD file:

<!DOCTYPE PcSpecs [
<!ELEMENT PCS (PC*)>
<!ELEMENT PC (MODEL, PRICE, PROCESSOR, RAM, DISK+)>
<!ELEMENT MODEL (\#PCDATA)>
<!ELEMENT PRICE (\#PCDATA)>
<!ELEMENT PROCESSOR (MANF, MODEL, SPEED)>
<!ELEMENT MANF (\#PCDATA)>
<!ELEMENT MODEL (\#PCDATA)>
<!ELEMENT SPEED (\#PCDATA)>
<!ELEMENT RAM (\#PCDATA)>
<!ELEMENT DISK (HARDDISK | CD | DVD)>
<!ELEMENT HARDDISK (MANF, MODEL, SIZE)>
<!ELEMENT SIZE (\#PCDATA)>
<!ELEMENT CD (SPEED)>
<!ELEMENT DVD (SPEED)>
]>

Thanks in advance.


原文:https://stackoverflow.com/questions/22758752
更新时间:2023-07-17 16:07

最满意答案

var methodsArray=[[{mark:Number,content:String}]]; 这除了methodsArray[0][0]没有任何内容。

methodsArray[i][x] (或者甚至methodsArray[i] )是undefined (除了当i===0x===0 [除了数组方法,例如,再次例如i===0x==="push"但这是离题)]。

如您的测试输出中所示,您的循环访问的内容不是methodsArray[0][0]并尝试设置属性。

如果你想要,你可以在旅途中创建元素:

var methodsArray = [];
for(var i = 0; i < req.body.numOfMethods; i++)
{
    methodsArray.push([]);
    for(var x = 0; x< numOfParts[i]; x++)
    {
        methodsArray.push({
          mark: parts[i][x].mark,
          content: parts[i][x].content
        });
    }
}

在创建methodsArray时,只需要完成一次。

作为另一个说明,我意识到你可能正在编写Typescript(或者Flow?)。 类型注释不使用=但是:所以它需要是var methodsArray:{mark:Number,content:String}[][];var methodsArray:Array<Array<{ mark:number, content:string }>>; 。 在Javascript中, var methodsArray=[[{ mark:number, content:string }]]; 是一个包含一个元素的Array,一个Array又有一个元素是一个对象,其中属性markNumber构造函数, contentString构造函数。


var methodsArray=[[{mark:Number,content:String}]]; this does not have anything except methodsArray[0][0].

methodsArray[i][x] (or even methodsArray[i]) is undefined (except when i===0 and x===0 [except again for Array methods, e.g. i===0 and x==="push" but that's off the point]).

As shown in your test output, your loop is accessing something other than methodsArray[0][0] and trying to set a property.

If you want you can create the elements on the go:

var methodsArray = [];
for(var i = 0; i < req.body.numOfMethods; i++)
{
    methodsArray.push([]);
    for(var x = 0; x< numOfParts[i]; x++)
    {
        methodsArray.push({
          mark: parts[i][x].mark,
          content: parts[i][x].content
        });
    }
}

This is only to be done once though, when creating methodsArray.

As another note, i realized you are likely writing Typescript (or maybe Flow?). Type annotations do not use = but :, so it would need to be var methodsArray:{mark:Number,content:String}[][]; or var methodsArray:Array<Array<{ mark:number, content:string }>>;. In Javascript, var methodsArray=[[{ mark:number, content:string }]]; is an Array with one element, an Array with again one element which is an object, where the property mark is the Number constructor and content is the String constructor.

相关问答

更多
  • 我不确定你为什么要使用provide和useClass在这里提供这项服务。 这通常是在您必须自己创建服务的自定义/轻量级实现时完成的(例如,当您将Angular的Router和ActivatedRoute注入为您的控制器的依赖项时)。 但是,对于当前方案,您只需要为已创建的服务引用注入的依赖项。 所以你可以简单地使用providers数组将它提供给你的测试模块,如下所示: beforeEach(async(() => { TestBed.configureTestingModule({ decl ...
  • 如果我理解正确,你想要突出显示所有找到的单词,而不只是一个。 在这种情况下, select_range不是要调用的函数,因为它会将选择更改为当前单词,并且GtkTextView选择是单个且连续的。 而是创建一个高亮标记并将其应用于所有搜索。 例如: # create the "highlight" tag (run this only once) textvu.buffer.create_tag("highlight", {background => "yellow"}) # ... later, in ...
  • 使用变量mark-active : mark-active is a variable defined in `C source code'. Its value is nil Local in buffer whole-line-or-region.el; global value is nil Automatically becomes buffer-local when set in any fashion. Documentation: Non-nil means the mark and ...
  • 我猜你显示的属性是displayChoices分配的一部分,即它是这样的: displayChoices = { ... payment_code: { label: "Payment Code", value: 'payment_code', choices: adminSalesStore.paymentCodes.map((payment_code) => { console.log(payment_code); ...
  • var methodsArray=[[{mark:Number,content:String}]]; 这除了methodsArray[0][0]没有任何内容。 methodsArray[i][x] (或者甚至methodsArray[i] )是undefined (除了当i===0和x===0 [除了数组方法,例如,再次例如i===0和x==="push"但这是离题)]。 如您的测试输出中所示,您的循环访问的内容不是methodsArray[0][0]并尝试设置属性。 如果你想要,你可以在旅途中创建元素: ...
  • 角度模型未定义,直到您在控制器中定义它或在输入中键入内容 试试这个 $ctrl.updateItem = function (item) { $ctrl.newItem = {action: item.action}; //... angular models undefined until you define it in controller or type something in input try this one $ctrl.updateItem ...
  • 当你编写一个扩展React.Component的react组件时,你不需要在React.Component之后使用extra () 用这个 export default class SearchList extends Component{ constructor(props){ super(props); } render(){ const { placeholder } = this.props; return( ...
  • NS不在全球范围内,您只能在您的生活范围内定义它。 尝试这个: window.NS = window.NS || {}; if (NS.MODULE === undefined) { NS.MODULE = {}; } NS is not in the global scope, you only define it in the scope of your iife. Try this: window.NS = window.NS || {}; if (NS.MODULE === undef ...
  • 文档提供了答案; 不幸的是,这不是一个明确的答案: 一般的reset合同是: 如果方法markSupported返回true ,则: 如果自创建流以来尚未调用方法标记,或者自上次调用标记以来从流中读取的字节数大于最后一次调用时标记的参数,则可能抛出IOException 。 如果未抛出此类IOException ,则将流重置为一种状态,以便从最近的标记调用(或自文件启动以来,如果尚未调用标记)读取的所有字节将重新提供给后续read方法的调用者,后跟任何字节,否则这些字节将是重置调用时的下一个输入数据。 如果 ...
  • 它们意味着同样的事情,它只是不同的措辞。 这意味着你做了类似的事情: console.log(a.X); ...其中a的值undefined : var a = undefined; try { console.log(a.X); } catch (e) { console.error(e.message); } 第一个是Google的JS引擎V8使用的措辞,它用于Chrome,Chromium和NodeJS等: https://github.com/v8/v8/blob/6eba6b4 ...

相关文章

更多

最新问答

更多
  • 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
  • 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
  • OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
  • 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
  • codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
  • 在计算机拍照在哪里进入
  • 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
  • No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
  • 单页应用程序:页面重新加载(Single Page Application: page reload)
  • 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
  • System.StackOverflow错误(System.StackOverflow error)
  • KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • C#类名中允许哪些字符?(What characters are allowed in C# class name?)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 在Angular 5中不是一个函数(is not a function in Angular 5)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • 常见的python rpc和cli接口(Common python rpc and cli interface)
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)