为什么this XML从id="33426841601"到id="asdf"时changing the integer仍然有效?
我对 RELAXNG 完全陌生,但我希望 this part of the vendor-provided schema 使其无效:
<r:attribute name="id">
<r:data type="integer"/>
</r:attribute>
但无论我如何篡改 XML,DOMDocument::relaxNGValidate 始终返回 true。
<?php
$valid = new DOMDocument;
$valid->load('valid.xml');
var_dump($valid->relaxNGValidate('relaxng.xml'));
$invalid = new DOMDocument;
$invalid->load('invalid.xml');
var_dump($invalid->relaxNGValidate('relaxng.xml'));
对于这个问题,我已经为download on Github准备了这些文件的存储库,以便可以轻松引用行号。这是 Digital Measures 公司提供的一个经过清理的样本。如果链接断开,这里是文件:
<?xml version="1.0" encoding="UTF-8"?>
<Data xmlns="http://www.digitalmeasures.com/schema/data" xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata" dmd:date="2016-06-13">
<Record userId="123456" username="jeffp" termId="129" dmd:surveyId="1234567">
<dmd:IndexEntry indexKey="AACSBSUFF" entryKey="Participating" text="Participating"/>
<dmd:IndexEntry indexKey="DEPARTMENT" entryKey="WCBD" text="WCBD"/>
<dmd:IndexEntry indexKey="QUALIFICATION" entryKey="Instructional Practitioner" text="Instructional Practitioner"/>
<dmd:IndexEntry indexKey="RANK" entryKey="Academic Staff" text="Academic Staff"/>
<GENSERVE id="33426841601" dmd:lastModified="2011-03-15T10:23:01" dmd:startDate="2010-07-01">
<TYPE>University</TYPE>
<TYPEOTHER/>
<ORG>University Academic Advising Council </ORG>
<ROLE>Committee Member</ROLE>
<ROLEOTHER/>
<OFFICE>President/Elect/Past</OFFICE>
<RESPONSIBILITIES/>
<NUMHOURS/>
<ELECAPP>Elected</ELECAPP>
<AUDIENCE>Local</AUDIENCE>
<EXOFFICIO/>
<DTM_START>July</DTM_START>
<DTD_START/>
<DTY_START>2010</DTY_START>
<START_START>2010-07-01</START_START>
<START_END>2010-07-31</START_END>
<DTM_END/>
<DTD_END/>
<DTY_END/>
<END_START></END_START>
<END_END></END_END>
</GENSERVE>
</Record>
</Data>
<?xml version="1.0" encoding="UTF-8"?>
<Data xmlns="http://www.digitalmeasures.com/schema/data" xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata" dmd:date="2016-06-13">
<Record userId="123456" username="jeffp" termId="129" dmd:surveyId="1234567">
<dmd:IndexEntry indexKey="AACSBSUFF" entryKey="Participating" text="Participating"/>
<dmd:IndexEntry indexKey="DEPARTMENT" entryKey="WCBD" text="WCBD"/>
<dmd:IndexEntry indexKey="QUALIFICATION" entryKey="Instructional Practitioner" text="Instructional Practitioner"/>
<dmd:IndexEntry indexKey="RANK" entryKey="Academic Staff" text="Academic Staff"/>
<GENSERVE id="asdf" dmd:lastModified="2011-03-15T10:23:01" dmd:startDate="2010-07-01">
<TYPE>University</TYPE>
<TYPEOTHER/>
<ORG>University Academic Advising Council </ORG>
<ROLE>Committee Member</ROLE>
<ROLEOTHER/>
<OFFICE>President/Elect/Past</OFFICE>
<RESPONSIBILITIES/>
<NUMHOURS/>
<ELECAPP>Elected</ELECAPP>
<AUDIENCE>Local</AUDIENCE>
<EXOFFICIO/>
<DTM_START>July</DTM_START>
<DTD_START/>
<DTY_START>2010</DTY_START>
<START_START>2010-07-01</START_START>
<START_END>2010-07-31</START_END>
<DTM_END/>
<DTD_END/>
<DTY_END/>
<END_START></END_START>
<END_END></END_END>
</GENSERVE>
</Record>
</Data>
<?xml version="1.0" encoding="UTF-8"?>
<r:grammar xmlns:r="http://relaxng.org/ns/structure/1.0" xmlns:dms="http://www.digitalmeasures.com/schema/schema-metadata" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<r:start>
<r:choice>
<r:element name="Data">
<r:ref name="Data"/>
</r:element>
<r:element name="Data" ns="http://www.digitalmeasures.com/schema/data">
<r:ref name="Data"/>
</r:element>
</r:choice>
</r:start>
<r:define name="Data">
<r:ref name="otherAttributes"/>
<r:ref name="otherElements"/>
<r:zeroOrMore>
<r:ref name="Record-INDIVIDUAL-ACTIVITIES-Business"/>
</r:zeroOrMore>
</r:define>
<r:define name="otherAttributes">
<r:zeroOrMore>
<r:attribute>
<r:anyName>
<r:except>
<r:nsName/>
</r:except>
</r:anyName>
</r:attribute>
</r:zeroOrMore>
</r:define>
<r:define name="otherElements">
<r:zeroOrMore>
<r:element>
<r:anyName>
<r:except>
<r:nsName/>
</r:except>
</r:anyName>
<r:zeroOrMore>
<r:choice>
<r:attribute>
<r:anyName/>
</r:attribute>
<r:text/>
<r:ref name="anyElements"/>
</r:choice>
</r:zeroOrMore>
</r:element>
</r:zeroOrMore>
</r:define>
<r:define name="anyElements">
<r:element>
<r:anyName/>
<r:zeroOrMore>
<r:choice>
<r:attribute>
<r:anyName/>
</r:attribute>
<r:text/>
<r:ref name="anyElements"/>
</r:choice>
</r:zeroOrMore>
</r:element>
</r:define>
<r:define name="Record-INDIVIDUAL-ACTIVITIES-Business">
<r:element name="Record">
<r:oneOrMore>
<r:choice>
<r:attribute name="userId">
<r:data type="integer"/>
</r:attribute>
<r:attribute name="username">
<r:data type="string"/>
</r:attribute>
<r:attribute name="UniversityID">
<r:data type="string"/>
</r:attribute>
</r:choice>
</r:oneOrMore>
<r:ref name="otherAttributes"/>
<r:interleave>
<r:ref name="otherElements"/>
<r:zeroOrMore>
<r:element name="GENSERVE" dms:text="General Service">
<r:optional>
<r:attribute name="id">
<r:data type="integer"/>
</r:attribute>
</r:optional>
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:interleave>
<r:optional>
<r:element name="TYPE" dms:text="Service Type">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="Option-ServiceType"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="TYPEOTHER" dms:text="Explanation of "Other"">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="string-maxLength-20000"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="ORG" dms:text="Organization/Committee/Club">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="string-maxLength-20000"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="ROLE" dms:text="Position/Role">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="Option-ServicePosition"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="ROLEOTHER" dms:text="Explanation of "Other"">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="string-maxLength-20000"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="OFFICE" dms:text="Title/Office Held">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="Option-OfficeType"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="RESPONSIBILITIES" dms:text="Describe the significance of the position and your responsibilities">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="string-maxLength-20000"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="NUMHOURS" dms:text="Approx. Number of Hours Spent Per Year">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="double"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="ELECAPP" dms:text="Elected/Appointed?">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="Option-AppointedElected"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="AUDIENCE" dms:text="Audience">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="Option-ServiceAudience"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="EXOFFICIO" dms:text="Served Ex-Officio?">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="Option-YesNo"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="DTM_START" dms:text="Start Month">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="Option-Month"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="DTD_START" dms:text="Start Day">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="integer-minInclusive-1-maxInclusive-31"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="DTY_START" dms:text="Start Year">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="integer-minInclusive-1900-maxInclusive-2100"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="START_START" dms:text="Start Start">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="date"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="START_END" dms:text="Start End">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="date"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="DTM_END" dms:text="End Month">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="Option-Month"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="DTD_END" dms:text="End Day">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="integer-minInclusive-1-maxInclusive-31"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="DTY_END" dms:text="End Year">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="integer-minInclusive-1900-maxInclusive-2100"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="END_START" dms:text="End Start">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="date"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="END_END" dms:text="End End">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:ref name="date"/>
</r:optional>
</r:element>
</r:optional>
<r:optional>
<r:element name="UPLOAD_FILE" dms:text="Supporting Documents">
<r:ref name="Access"/>
<r:ref name="otherAttributes"/>
<r:optional>
<r:attribute name="newFile">
<r:data type="string"/>
</r:attribute>
</r:optional>
<r:optional>
<r:text/>
</r:optional>
</r:element>
</r:optional>
</r:interleave>
</r:element>
</r:zeroOrMore>
</r:interleave>
</r:element>
</r:define>
<r:define name="Access">
<r:optional>
<r:attribute name="access">
<r:choice>
<r:value>READ_ONLY</r:value>
<r:value>HIDDEN</r:value>
<r:value>LOCKED</r:value>
</r:choice>
</r:attribute>
</r:optional>
</r:define>
<r:define name="Option-ServiceType">
<r:choice>
<r:value>College</r:value>
<r:value>Department</r:value>
<r:value>Professional</r:value>
<r:value>Public/Community</r:value>
<r:value>Student Organization</r:value>
<r:value>University</r:value>
<r:value>Other</r:value>
</r:choice>
</r:define>
<r:define name="string-maxLength-20000">
<r:data type="string">
<r:param name="maxLength">20000</r:param>
</r:data>
</r:define>
<r:define name="Option-ServicePosition">
<r:choice>
<r:value>Activity to Bridge Campus and Community</r:value>
<r:value>Administrative Assignment, Assistant Dean</r:value>
<r:value>Administrative Assignment, Associate Dean</r:value>
<r:value>Administrative Assignment, Dean</r:value>
<r:value>Administrative Assignment, Other</r:value>
<r:value>Attendee, Award Ceremony</r:value>
<r:value>Attendee, Convocation</r:value>
<r:value>Attendee, Graduation</r:value>
<r:value>Attendee, Meeting</r:value>
<r:value>Attendee, Orientation</r:value>
<r:value>Co-Chair</r:value>
<r:value>Committee Chair</r:value>
<r:value>Committee Member</r:value>
<r:value>Conference Chairperson</r:value>
<r:value>Conference Discussant</r:value>
<r:value>Conference Panel</r:value>
<r:value>Conference Program Organizer</r:value>
<r:value>Conference Reviewer</r:value>
<r:value>Conference Session Chair</r:value>
<r:value>Conference Track Organizer</r:value>
<r:value>Department Chairperson</r:value>
<r:value>Endowed Chair Review Committee</r:value>
<r:value>External Grant Proposal Reviewer</r:value>
<r:value>Guest Speaker</r:value>
<r:value>Interaction with Industry</r:value>
<r:value>Internal Grant Proposal Reviewer</r:value>
<r:value>Member of Professional Organization</r:value>
<r:value>Prepare/Grade Certification Exams</r:value>
<r:value>Pro Bono Professional Service</r:value>
<r:value>Student Org Advisor (Non-Professional Org)</r:value>
<r:value>Student Org Advisor (Professional Org)</r:value>
<r:value>Student Placement</r:value>
<r:value>Student Recruiter</r:value>
<r:value>Tenure Reviewer for Another Institution</r:value>
<r:value>Track Co-Chair</r:value>
<r:value>University Senate Service</r:value>
<r:value>Workshop Organizer</r:value>
<r:value>Other</r:value>
</r:choice>
</r:define>
<r:define name="Option-OfficeType">
<r:choice>
<r:value>Member</r:value>
<r:value>President/Elect/Past</r:value>
<r:value>Other Officer</r:value>
<r:value>Other</r:value>
</r:choice>
</r:define>
<r:define name="double">
<r:data type="double"/>
</r:define>
<r:define name="Option-AppointedElected">
<r:choice>
<r:value>Appointed</r:value>
<r:value>Elected</r:value>
</r:choice>
</r:define>
<r:define name="Option-ServiceAudience">
<r:choice>
<r:value>International</r:value>
<r:value>National</r:value>
<r:value>Regional</r:value>
<r:value>State</r:value>
<r:value>Local</r:value>
</r:choice>
</r:define>
<r:define name="Option-YesNo">
<r:choice>
<r:value>Yes</r:value>
<r:value>No</r:value>
</r:choice>
</r:define>
<r:define name="Option-Month">
<r:choice>
<r:value>January</r:value>
<r:value>February</r:value>
<r:value>March</r:value>
<r:value>April</r:value>
<r:value>May</r:value>
<r:value>June</r:value>
<r:value>July</r:value>
<r:value>August</r:value>
<r:value>September</r:value>
<r:value>October</r:value>
<r:value>November</r:value>
<r:value>December</r:value>
</r:choice>
</r:define>
<r:define name="integer-minInclusive-1-maxInclusive-31">
<r:data type="integer">
<r:param name="minInclusive">1</r:param>
<r:param name="maxInclusive">31</r:param>
</r:data>
</r:define>
<r:define name="integer-minInclusive-1900-maxInclusive-2100">
<r:data type="integer">
<r:param name="minInclusive">1900</r:param>
<r:param name="maxInclusive">2100</r:param>
</r:data>
</r:define>
<r:define name="date">
<r:data type="date"/>
</r:define>
</r:grammar>
最佳答案
放下xmlns="http://www.digitalmeasures.com/schema/data"来自 Data元素。
您使用的 RelaxNG 语法定义了两个不同的 Data元素:一个 Data元素不在命名空间中,另一个在 http://www.digitalmeasures.com/schema/data 中命名空间。您的文档似乎是语法对无命名空间情况的期望实例。
删除 xmlns="http://www.digitalmeasures.com/schema/data"来自 Data invalid.xml 中的元素文件你应该得到类似以下的错误:
invalid.xml:4:82: error: Attribute “termId” not allowed on element “Record” in this context. invalid.xml:9:95: error: Bad value “asdf” for attribute “id” on element “GENSERVE”.
关于php - 如何使用 RELAXNG 验证 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38899917/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t