我正在寻找一个教程来加载XML文件,读取它,更改它,最后用C++保存它.我正在使用Linux Ubuntu并尝试使用Xerces.谷歌和很多时间,我只能加载一个XML文件:
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <iostream>
using namespace std;
using namespace xercesc;
int main (int argc, char* args[]) {
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Error during initialization! :\n"
<< message << "\n";
XMLString::release(&message);
return 1;
}
XercesDOMParser* parser = new XercesDOMParser();
parser->setValidationScheme(XercesDOMParser::Val_Always);
parser->setDoNamespaces(true); // optional
ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
parser->setErrorHandler(errHandler);
const char* xmlFile = "demo.xml";
try {
parser->parse(xmlFile);
}
catch …
Run Code Online (Sandbox Code Playgroud) 这个问题与最快的XML解析器有些相关, 适用于Java中的小型简单文档, 但有一些更具体的细节.
我正在开发一个需要解析许多(数百万),小(约300k)xml文档的应用程序.目前的实现是使用xerces-j,并且在1.5 GHz机器上每xml文档大约需要2.5 ms.我想改善这种表现.我偶然发现了这篇文章
http://www.xml.com/pub/a/2007/05/16/xml-parser-benchmarks-part-2.html
声称libxml2可以解析比任何java解析器快一个数量级.我不确定我是否相信它,但它引起了我的注意. 有没有人尝试过使用jvm中的libxml2?如果是这样,它比java dom解析(xerces)更快吗? 我想我仍然需要我的java dom结构,但我猜测从c-struct dom复制到java-dom不应该花费很长时间.我必须有java-dom - sax在这种情况下不会帮助我.
更新:我刚刚为libxml2写了一个测试,它没有比xerces快得多...授予我的c编码能力非常生疏.
更新我在这里扩展了一个问题: 为什么sax解析比dom解析更快?stax是如何工作的? 并且我愿意放弃dom.
谢谢
我正在使用Apache Xerces 2.11.0和Apache Xalan 2.7.1,我在序列化的XML中遇到了额外的回车字符问题.
我有这个(伪)代码:
String myString = ...;
Document doc = ...;
Element item = doc.createElement("item");
item.appendChild(doc.createCDATASection(myString));
Transformer transformer = ...;
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Result result = new StreamResult(stream);
transformer.transform(new DOMSource(document), result);
Run Code Online (Sandbox Code Playgroud)
现在myString
包含换行符(\r\n
),(实际上它是base64编码数据)但是当我查看序列化输出时,还有其他\r
字符.
输入:
Line 1 \r\n
Line 2 \r\n
Line 3 \r\n
Run Code Online (Sandbox Code Playgroud)
输出:
Line 1 \r\r\n
Line 2 \r\r\n
Line 3 \r\r\n
Run Code Online (Sandbox Code Playgroud)
如果我使用createTextNode
而不是createCDATASection
输出变得更有趣:
Line 1 \r\n
Line 2 \r\n
Line 3 \r\n
Run Code Online (Sandbox Code Playgroud)
似乎在序列化期间引入了附加字符,DOM树似乎是正确的.(根据getTextContent() …
我有一个包含Xerces库的Java项目.
当我用Proguard处理项目时,我收到警告:
Note: duplicate definition of library class [org.w3c.dom.html.HTMLDOMImplementation]
Run Code Online (Sandbox Code Playgroud)
我在Xerces中看到这个类存在,并且JDK 1.6的rt.jar中存在相同的类.
ProGuard创建的jar文件无法启动(错误:"发生了Java异常").我怎么解决这个问题?谢谢!
(注意:我与Netbeans合作)
我正在使用Java 6.我想解析我知道格式正确的XHTML.因此,我不想对文档中引用的DTD或其他模式进行任何验证.但是,我无法弄清楚如何关闭验证.我有
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
final DocumentBuilder b = factory.newDocumentBuilder();
final InputSource s = new InputSource(new StringReader(str));
org.w3c.dom.Document result = b.parse(s);
Run Code Online (Sandbox Code Playgroud)
但我仍然在最后一行得到例外......
java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:777)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:640)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:774)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:640)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:677)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1315)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:1282)
at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:283)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1194)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1090)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1003)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
at com.myco.myproj.util.XmlUtilities.getStringAsDocument(XmlUtilities.java:130)
at com.myco.myproj.util.NetUtilities.getUrlAsDocument(NetUtilities.java:30)
at com.myco.myproj.parsers.impl.AbstractChicagoReaderParser.parsePage(AbstractChicagoReaderParser.java:144)
at com.myco.myproj.parsers.impl.AbstractChicagoReaderParser.getEvents(AbstractChicagoReaderParser.java:112)
at com.myco.myproj.parsers.impl.ChicagoReaderParserTest.testParser(ChicagoReaderParserTest.java:29)
at …
Run Code Online (Sandbox Code Playgroud) 我正在尝试设计一个模式来验证已经在应用程序中使用的xml格式(重新设计xml的空间不大).
我正在尝试利用xml架构字典的key和keyref元素来验证身份约束.
一个特别的问题是xml模拟一对多关系的方式
<spaceships>
<spaceship guns="gun1 gun2 gun3"/>
</spaceships>
<guns>
<gun id="gun1"/>
<gun id="gun2"/>
<gun id="gun3"/>
</guns>
Run Code Online (Sandbox Code Playgroud)
我在我的架构中想出了这对key/keyref
<xs:key name="gunKey">
<xs:selector xpath="guns/gun" />
<xs:field xpath="@id" />
</xs:key>
<xs:keyref name="gunRef" refer="gunKey">
<xs:selector xpath="spaceships/spaceship" />
<xs:field xpath="@guns" />
</xs:keyref>
Run Code Online (Sandbox Code Playgroud)
这不会与xerces抗议验证:
键'gun1 gun2 gun3'键'gunRef'找不到元素的身份约束.
无论如何,在模式中表示列表的值是逗号分隔的对另一个实体的引用列表,并仍然获得身份约束验证的好处?
在jdk1.6中,当我设置
transformerFactory.setFeature(XMLConstants.ACCESS_EXTERNAL_DTD, false)
Run Code Online (Sandbox Code Playgroud)
我遇到以下错误:
javax.xml.transform.TransformerConfigurationException:无法在此TransformerFactory上设置功能' http://javax.xml.XMLConstants/property/accessExternalDTD '。在org.apache.xalan.processor.TransformerFactoryImpl.setFeature(TransformerFactoryImpl.java:418)
就像我在这里找到的一样:如何防止具有META-INF \ services \ javax.xml.transform.TransformerFactory的xalan.jar接管Xalan实现中内置的JDK 1.6? 我无法进行此处建议的更改,因为管理员还会查看其他API冲突。
并按此链接:http : //xml.apache.org/xalan-j/features.html#domsource
您可以使用该TransformerFactory.setFeature(String, boolean)
方法来设置功能的值。Xalan-Java仅支持设置XMLConstants.FEATURE_SECURE_PROCESSING
功能。对于所有其他功能,TransformerFactory公开其值,但不能更改其状态。
因此,如果使用TransormerFactory的xalan实现,似乎只能设置此功能。
transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
Run Code Online (Sandbox Code Playgroud)
最后我的问题:如果我们设置功能:
transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
Run Code Online (Sandbox Code Playgroud)
然后是另一个功能(XMLConstants.ACCESS_EXTERNAL_DTD
)自动设置为false。
我从设置的日志中获得了上述功能“ false”。但是我想确定是否accessExternalDTD
默认将功能设置为false或将安全处理功能设置为true。
在AIX平台上将ear文件部署到WLS 10.3时,我收到此错误.同样的耳朵在Windows/Linux平台上运行良好.
Caused by: java.lang.ClassCastException: org.apache.xerces.parsers.XIncludeAwareParserConfiguration incompatible with org.apache.xerces.xni.parser.XMLParserConfiguration
at org.apache.xerces.parsers.DOMParser.<init>(Unknown Source)
at org.apache.xerces.parsers.DOMParser.<init>(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.<init>(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.newDocumentBuilder(Unknown Source)
at weblogic.xml.jaxp.WebLogicDocumentBuilderFactory.newDocumentBuilder(WebLogicDocumentBuilderFactory.java:140)
at com.bea.security.xacml.policy.PolicyUtils.getRootNode(PolicyUtils.java:54)
at com.bea.security.xacml.policy.PolicyUtils.read(PolicyUtils.java:86)
at com.bea.security.providers.xacml.store.BasePolicyStore.getAbstractPolicy(BasePolicyStore.java:1251)
at com.bea.security.providers.xacml.store.BasePolicyStore.readPolicy(BasePolicyStore.java:1231)
at com.bea.security.providers.xacml.store.BasePolicyStore.readPolicy(BasePolicyStore.java:1114)
at com.bea.security.providers.xacml.entitlement.PolicyManager.listPolicies(PolicyManager.java:747)
at weblogic.security.providers.xacml.DeployableAuthorizationProviderV2Helper.startDeployPolicies(DeployableAuthorizationProviderV2Helper.java:90)
at weblogic.security.providers.xacml.authorization.XACMLAuthorizationProviderImpl.startDeployPolicies(XACMLAuthorizationProviderImpl.java:269)
at com.bea.common.security.internal.legacy.service.PolicyDeployerProviderImpl$V2Adapter.startDeployPolicies(PolicyDeployerProviderImpl.java:69)
at com.bea.common.security.internal.service.PolicyDeploymentServiceImpl$DeploymentHandlerImpl.<init>(PolicyDeploymentServiceImpl.java:143)
at com.bea.common.security.internal.service.PolicyDeploymentServiceImpl$DeploymentHandlerImpl.<init>(PolicyDeploymentServiceImpl.java:129)
at com.bea.common.security.internal.service.PolicyDeploymentServiceImpl$ServiceImpl.startDeployPolicies(PolicyDeploymentServiceImpl.java:97)
at weblogic.security.service.WLSPolicyDeploymentServiceWrapper$DeploymentHandlerImpl.<init>(WLSPolicyDeploymentServiceWrapper.java:70)
at weblogic.security.service.WLSPolicyDeploymentServiceWrapper$DeploymentHandlerImpl.<init>(WLSPolicyDeploymentServiceWrapper.java:60)
at weblogic.security.service.WLSPolicyDeploymentServiceWrapper.startDeployPolicies(WLSPolicyDeploymentServiceWrapper.java:40)
at weblogic.security.service.AuthorizationManager.startDeployPolicies(AuthorizationManager.java:489)
at weblogic.servlet.security.internal.WebAppSecurityWLS.<init>(WebAppSecurityWLS.java:72)
at weblogic.servlet.security.internal.ServletSecurityManager.<init>(ServletSecurityManager.java:39)
at weblogic.servlet.internal.WebAppServletContext.<init>(WebAppServletContext.java:416)
at weblogic.servlet.internal.WebAppServletContext.<init>(WebAppServletContext.java:464)
at weblogic.servlet.internal.HttpServer.loadWebApp(HttpServer.java:414)
at weblogic.servlet.internal.WebAppModule.registerWebApp(WebAppModule.java:901)
at weblogic.servlet.internal.WebAppModule.prepare(WebAppModule.java:345)
Run Code Online (Sandbox Code Playgroud) 我想知道该xercesxmldom
单元作为XML DOM实现之一发生了什么.
它似乎在Delphi XE中消失了.
为什么?
(我搜索了文档;找不到关于xercesxmldom消失的任何相关信息).
编辑:这些是我存档的来源:
R:\>dir /s /b xercesxmldom.pas
R:\D2006-Enterprise-D10-BDS-4.0\source\Win32\xml\xercesxmldom.pas
R:\D2007-Enterprise-D11-RadStudio-5.0\source\Win32\xml\xercesxmldom.pas
R:\D2009-Enterprise-D12-RadStudio-6.0\source\Win32\xml\xercesxmldom.pas
R:\D2010-Enterprise-D14-RadStudio-7.0\source\Win32\xml\xercesxmldom.pas
R:\D7.01.Architect\Source\Xml\xercesxmldom.pas
Run Code Online (Sandbox Code Playgroud)
R:\DXE-Enterprise-D15-RadStudio-8.0
源树中没有任何内容......
--jeroen
我有一个带utf8编码的xml.此文件包含BOM作为文件的开头.所以在解析过程中我遇到了org.xml.sax.SAXParseException:prolog中不允许使用内容.我无法从文件中删除这3个字节.我无法将文件加载到内存中并在此处删除它们(文件很大).因此,出于性能原因,我正在使用SAX解析器,如果它们在""标记之前存在,则只想跳过这3个字节.我应该为此继承InputStreamReader吗?
我是java的新手 - 请告诉我正确的方法.