我正在尝试解析WiX安装程序中的一些XML.XML将是从Web服务器返回的所有错误的对象.我使用以下代码在问题标题中收到错误:
XmlDocument xml = new XmlDocument();
try
{
xml.LoadXml(myString);
}
catch (Exception ex)
{
System.IO.File.WriteAllText(@"C:\text.txt", myString + "\r\n\r\n" + ex.Message);
throw ex;
}
Run Code Online (Sandbox Code Playgroud)
myString是这个(如输出中所示text.txt)
<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>
Run Code Online (Sandbox Code Playgroud)
text.txt 看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>
Data at the root level is invalid. Line 1, position 1.
Run Code Online (Sandbox Code Playgroud)
我需要解析这个XML,所以我可以看到我是否有任何错误.
编辑
这个问题不是标记的重复.在那个问题中,提出问题的人正在使用LoadXml解析XML文件.我正在解析一个字符串,这是正确使用的LoadXml
我如何在C#中编写解析器(递归下降?)?现在我只想要一个解析算术表达式(并读取变量?)的简单解析器.虽然后来我打算写一个xml和html解析器(用于学习目的).我这样做是因为解析器很有用的东西:Web开发,编程语言解释器,内部工具,游戏引擎,地图和平铺编辑器等.那么编写解析器的基本理论是什么呢?我该怎么做在C#中实现一个?C#是解析器的正确语言(我曾经在C++中编写了一个简单的算术解析器并且它很有效.JIT编译是否同样适用?).任何有用的资源和文章.最重要的是,代码示例(或代码示例的链接).
注意:出于好奇,有人回答这个问题曾经在C#中实现了解析器吗?
我有一个xml doc,我试图使用Etree.lxml解析
<Envelope xmlns="http://www.example.com/zzz/yyy">
<Header>
<Version>1</Version>
</Header>
<Body>
some stuff
<Body>
<Envelope>
Run Code Online (Sandbox Code Playgroud)
我的代码是:
path = "path to xml file"
from lxml import etree as ET
parser = ET.XMLParser(ns_clean=True)
dom = ET.parse(path, parser)
dom.getroot()
Run Code Online (Sandbox Code Playgroud)
当我尝试获取dom.getroot()时,我得到:
<Element {http://www.example.com/zzz/yyy}Envelope at 28adacac>
Run Code Online (Sandbox Code Playgroud)
但是我只想要:
<Element Envelope at 28adacac>
Run Code Online (Sandbox Code Playgroud)
当我做
dom.getroot().find("Body")
Run Code Online (Sandbox Code Playgroud)
我没有得到任何回报.但是,当我
dom.getroot().find("{http://www.example.com/zzz/yyy}Body")
Run Code Online (Sandbox Code Playgroud)
我得到了一个结果.
我认为将ns_clean = True传递给解析器会阻止这种情况.
有任何想法吗?
我正在用Java编写一个程序,它接受一个自定义XML文件并解析它.我正在使用XML文件进行存储.我在Eclipse中收到以下错误.
[Fatal Error] :1:1: Content is not allowed in prolog.
org.xml.sax.SAXParseException: Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:239)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283 )
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:208)
at me.ericso.psusoc.RequirementSatisfier.parseXML(RequirementSatisfier.java:61)
at me.ericso.psusoc.RequirementSatisfier.getCourses(RequirementSatisfier.java:35)
at me.ericso.psusoc.programs.RequirementSatisfierProgram.main(RequirementSatisfierProgram.java:23 )
Run Code Online (Sandbox Code Playgroud)
包含XML文件的开头:
<?xml version="1.0" ?>
<PSU>
<Major id="IST">
<name>Information Science and Technology</name>
<degree>B.S.</degree>
<option> Information Systems: Design and Development Option</option>
<requirements>
<firstlevel type="General_Education" credits="45">
<component type="Writing_Speaking">GWS</component>
<component type="Quantification">GQ</component>
Run Code Online (Sandbox Code Playgroud)
该程序能够读取XML文件,但是当我调用DocumentBuilder.parse(XMLFile)解析时org.w3c.dom.Document,我得到上面的错误.
在我看来,我的XML文件的prolog中包含无效内容.我无法弄清楚出了什么问题.请帮忙.谢谢.
我有一个包含以下行的文件:
<parameter name="PortMappingEnabled" access="readWrite" type="xsd:boolean"></parameter>
<parameter name="PortMappingLeaseDuration" access="readWrite" activeNotify="canDeny" type="xsd:unsignedInt"></parameter>
<parameter name="RemoteHost" access="readWrite"></parameter>
<parameter name="ExternalPort" access="readWrite" type="xsd:unsignedInt"></parameter>
<parameter name="ExternalPortEndRange" access="readWrite" type="xsd:unsignedInt"></parameter>
<parameter name="InternalPort" access="readWrite" type="xsd:unsignedInt"></parameter>
<parameter name="PortMappingProtocol" access="readWrite"></parameter>
<parameter name="InternalClient" access="readWrite"></parameter>
<parameter name="PortMappingDescription" access="readWrite"></parameter>
Run Code Online (Sandbox Code Playgroud)
我想在此文件上执行命令以仅提取以下输出中显示的参数名称:
$sedcommand file.txt
PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription
Run Code Online (Sandbox Code Playgroud)
这个命令可能是什么?
我正在尝试编写一个帮助我创建XML对象的代码.例如,我将给一个字符串作为函数的输入,它将返回一个XMLObject.
XMLObject convertToXML(String s) {}
Run Code Online (Sandbox Code Playgroud)
当我在网上搜索时,通常我会看到有关创建XML文档的示例.所以我看到的关于创建XML并写入文件并创建文件的所有内容.但我做了类似的事情:
Document document = new Document();
Element child = new Element("snmp");
child.addContent(new Element("snmpType").setText("snmpget"));
child.addContent(new Element("IpAdress").setText("127.0.0.1"));
child.addContent(new Element("OID").setText("1.3.6.1.2.1.1.3.0"));
document.setContent(child);
Run Code Online (Sandbox Code Playgroud)
您认为创建XML对象是否足够?还能帮助我如何从XML获取数据吗?例如,我如何IpAdress从XML获取?
非常感谢你们
编辑1:实际上现在我觉得我可能会更容易拥有一个像这样的文件base.xml,我会把所有基本的东西写进去,例如:
<snmp>
<snmpType><snmpType>
<OID></OID>
</snmp>
Run Code Online (Sandbox Code Playgroud)
然后使用此文件创建XML对象.你觉得怎么样?
我变得非常奇怪"文件过早结束." 我们的一台服务器上的最近几天例外.在相同的配置XML工作正常另一台服务器上.我们在这两台服务器上都使用Tomcat 5.0.28.此代码已经工作了很长时间(7年以上),只有在最近服务器崩溃后,我们才在其中一台服务器上遇到此问题.XML和Java解析代码没有变化.:(
我能看到的唯一区别是Java版本 -
问题服务器 java版"1.6.0_16"Java(TM)SE运行时环境(版本1.6.0_16-b01)Java HotSpot(TM)64位服务器VM(版本14.2-b01,混合模式)
工作服务器 java版"1.6.0_07"Java(TM)SE运行时环境(版本1.6.0_07-b06)Java HotSpot(TM)64位服务器VM(版本10.0-b23,混合模式)
以下是已经工作了几年的Java代码 -
private void readSource(final InputSource in ) {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(in);
Element elt = doc.getDocumentElement();
this.readElement( elt );
} catch ( Exception ex ) {
ex.printStackTrace();
throw new ConfigurationException( "Unable to parse configuration information", ex );
}
}
Run Code Online (Sandbox Code Playgroud)
这是例外.
[Fatal Error] :-1:-1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at …Run Code Online (Sandbox Code Playgroud) 我是使用XML的新手,但只是需要放弃我的膝盖.我得到了一个通常的(对我来说)XML格式.标签内有冒号.
<THING1:things type="Container">
<PART1:Id type="Property">1234</PART1:Id>
<PART1:Name type="Property">The Name</PART1:Name>
</THING1:things>
Run Code Online (Sandbox Code Playgroud)
它是一个大文件,除此之外还有更多内容,但我希望这种格式对某人来说很熟悉.有没有人知道如何处理这种XML文档?
我宁愿不只是写一个解析文本的蛮力方式,但我似乎无法用REXML或Hpricot取得任何进展,我怀疑这是由于这些不寻常的标签.
我的红宝石代码:
require 'hpricot'
xml = File.open( "myfile.xml" )
doc = Hpricot::XML( xml )
(doc/:things).each do |thg|
[ 'Id', 'Name' ].each do |el|
puts "#{el}: #{thg.at(el).innerHTML}"
end
end
Run Code Online (Sandbox Code Playgroud)
...刚从...取消:http://railstips.org/blog/archives/2006/12/09/parsing-xml-with-hpricot/
我想我可以从这里找到一些东西,但这段代码什么都没有.它没有错误.它只是回来了.
我在尝试解析C#应用程序中的XML文档时遇到此错误:
"出于安全原因,此XML文档中禁止使用DTD.要启用DTD处理,请将XmlReaderSettings上的ProhibitDtd属性设置为false,并将设置传递给XmlReader.Create方法."
作为参考,异常发生在以下代码的第二行:
using (XmlReader reader = XmlReader.Create(uri))
{
reader.MoveToContent(); //here
while (reader.Read()) //(code to parse xml doc follows).
Run Code Online (Sandbox Code Playgroud)
我对Xml的了解非常有限,我不知道DTD处理是什么,也不知道如何做错误消息的建议.有关可能导致此问题以及如何解决问题的任何帮助?谢谢...
我的问题是:当存在与父元素的"孙子"同名的其他元素时,如何直接在特定父元素下获取元素.
我正在使用Java DOM库来解析XML 元素,我遇到了麻烦.下面是一些我使用的XML(可一小部分):
<notifications>
<notification>
<groups>
<group name="zip-group.zip" zip="true">
<file location="C:\valid\directory\" />
<file location="C:\another\valid\file.doc" />
<file location="C:\valid\file\here.txt" />
</group>
</groups>
<file location="C:\valid\file.txt" />
<file location="C:\valid\file.xml" />
<file location="C:\valid\file.doc" />
</notification>
</notifications>
Run Code Online (Sandbox Code Playgroud)
如您所见,您可以在两个位置放置<file>元素.无论是团体还是外部团体.我真的希望它以这种方式构建,因为它更加用户友好.
现在,每当我调用notificationElement.getElementsByTagName("file");它时,都会给我所有<file>元素,包括元素下的<group>元素.我以不同方式处理这些类型的文件,因此不希望使用此功能.
我想到了两个解决方案:
<notification>还是<group>.<file>元素以避免混淆.这些解决方案都不是那么令人满意,只是按照它们的方式离开事物,只获得<file>元素的直接<notification>元素.
我对IMPO的评论和答案是开放的,关于"最好"的方法,但我真的对DOM解决方案感兴趣,因为这是该项目的其余部分正在使用的.谢谢.