2014-09-10 100 views
0

我想在MATLAB中修改svg文件的xml文本信息。 我改名为SVG文件到XML文件无法将char数据保存到MATLAB中的xml文件中

system('rename *myfile.svg* *myfile.xml') 

得到了XML文本信息:

fid = fopen(‘myfile.xml'); 
    XMLdata = fscanf(fid, '%s'); 

XMLDATA是一个包含XML文本信息 现在我可以修改XMLDATA使用STRCMP用于例如字符数组:

new_claim = strrep(XMLdata, 'Sans', 'Times New Roman') 

现在我不能使用xmlwrite

写这篇XMLDATA XML文件
xmlwrite('fileout.xml', XMLdata) 

我得到错误使用javaMethod Java异常

发生错误:

javax.xml.transform.TransformerException: java.net.MalformedURLException: no protocol: 
<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><!--CreatedwithInkscape(http://www.inkscape.org/)--><svgxmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:cc="http://creativecommons.org/ns#"xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:svg="http://www.w3.org/2000/svg"xmlns="http://www.w3.org/2000/svg"xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"width="64"height="48"id="svg3033"version="1.1"inkscape:version="0.48.5r10040"sodipodi:docname="200mn.svg"><defsid="defs3035"/><sodipodi:namedviewid="base"pagecolor="#ffffff"bordercolor="#666666"borderopacity="1.0"inkscape:pageopacity="0.0"inkscape:pageshadow="2"inkscape:zoom="5.916495"inkscape:cx="61.898573"inkscape:cy="54.220135"inkscape:document-units="px"inkscape:current-layer="layer1"showgrid="false"inkscape:window-width="1280"inkscape:window-height="962"inkscape:window-x="-8"inkscape:window-y="-8"inkscape:window-maximized="1"/><metadataid="metadata3038"><rdf:RDF><cc:Workrdf:about=""><dc:format>image/svg+xml</dc:format><dc:typerdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title></dc:title></cc:Work></rdf:RDF></metadata><ginkscape:label="Layer1"inkscape:groupmode="layer"id="layer1"transform="translate(0,-1004.3622)"><textxml:space="preserve"style="font-size:28px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Calibri;-inkscape-font-specification:Calibri"x="1.3270224e-007"y="1035.7983"id="text3049"sodipodi:linespacing="125%"><tspansodipodi:role="line"id="tspan3051"x="1.3270224e-007"y="1035.7983">200m</tspan></text></g></svg> 

    at com.icl.saxon.IdentityTransformer.transform(IdentityTransformer.java:92) 

    at com.mathworks.xml.XMLUtils.serializeXML(XMLUtils.java:175) 

    at com.mathworks.xml.XMLUtils.serializeXML(XMLUtils.java:44) 

Caused by: java.net.MalformedURLException: no protocol: 
<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><!--CreatedwithInkscape(http://www.inkscape.org/)--><svgxmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:cc="http://creativecommons.org/ns#"xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:svg="http://www.w3.org/2000/svg"xmlns="http://www.w3.org/2000/svg"xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"width="64"height="48"id="svg3033"version="1.1"inkscape:version="0.48.5r10040"sodipodi:docname="200mn.svg"><defsid="defs3035"/><sodipodi:namedviewid="base"pagecolor="#ffffff"bordercolor="#666666"borderopacity="1.0"inkscape:pageopacity="0.0"inkscape:pageshadow="2"inkscape:zoom="5.916495"inkscape:cx="61.898573"inkscape:cy="54.220135"inkscape:document-units="px"inkscape:current-layer="layer1"showgrid="false"inkscape:window-width="1280"inkscape:window-height="962"inkscape:window-x="-8"inkscape:window-y="-8"inkscape:window-maximized="1"/><metadataid="metadata3038"><rdf:RDF><cc:Workrdf:about=""><dc:format>image/svg+xml</dc:format><dc:typerdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title></dc:title></cc:Work></rdf:RDF></metadata><ginkscape:label="Layer1"inkscape:groupmode="layer"id="layer1"transform="translate(0,-1004.3622)"><textxml:space="preserve"style="font-size:28px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Calibri;-inkscape-font-specification:Calibri"x="1.3270224e-007"y="1035.7983"id="text3049"sodipodi:linespacing="125%"><tspansodipodi:role="line"id="tspan3051"x="1.3270224e-007"y="1035.7983">200m</tspan></text></g></svg> 

at java.net.URL.<init>(Unknown Source) 

at java.net.URL.<init>(Unknown Source) 

at java.net.URL.<init>(Unknown Source) 

at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) 

at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown 
Source) 

at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 

at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 

at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 

at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 

at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 

at com.icl.saxon.IdentityTransformer.transform(IdentityTransformer.java:90) 

... 2 more 

java.net.MalformedURLException: no protocol: 
<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><!--CreatedwithInkscape(http://www.inkscape.org/)--><svgxmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:cc="http://creativecommons.org/ns#"xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:svg="http://www.w3.org/2000/svg"xmlns="http://www.w3.org/2000/svg"xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"width="64"height="48"id="svg3033"version="1.1"inkscape:version="0.48.5r10040"sodipodi:docname="200mn.svg"><defsid="defs3035"/><sodipodi:namedviewid="base"pagecolor="#ffffff"bordercolor="#666666"borderopacity="1.0"inkscape:pageopacity="0.0"inkscape:pageshadow="2"inkscape:zoom="5.916495"inkscape:cx="61.898573"inkscape:cy="54.220135"inkscape:document-units="px"inkscape:current-layer="layer1"showgrid="false"inkscape:window-width="1280"inkscape:window-height="962"inkscape:window-x="-8"inkscape:window-y="-8"inkscape:window-maximized="1"/><metadataid="metadata3038"><rdf:RDF><cc:Workrdf:about=""><dc:format>image/svg+xml</dc:format><dc:typerdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title></dc:title></cc:Work></rdf:RDF></metadata><ginkscape:label="Layer1"inkscape:groupmode="layer"id="layer1"transform="translate(0,-1004.3622)"><textxml:space="preserve"style="font-size:28px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Calibri;-inkscape-font-specification:Calibri"x="1.3270224e-007"y="1035.7983"id="text3049"sodipodi:linespacing="125%"><tspansodipodi:role="line"id="tspan3051"x="1.3270224e-007"y="1035.7983">200m</tspan></text></g></svg> 

    at java.net.URL.<init>(Unknown Source) 

    at java.net.URL.<init>(Unknown Source) 

    at java.net.URL.<init>(Unknown Source) 

    at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) 

    at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown 
    Source) 

    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 

    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 

    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 

    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 

    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 

    at com.icl.saxon.IdentityTransformer.transform(IdentityTransformer.java:90) 

    at com.mathworks.xml.XMLUtils.serializeXML(XMLUtils.java:175) 

    at com.mathworks.xml.XMLUtils.serializeXML(XMLUtils.java:44) 


Error in xmlwrite (line 83) 
javaMethod('serializeXML',... 
+0

我没有任何使用'xmlwrite'的经验,但看着[文档](http://www.mathworks.com/help/matlab/ref/xmlwrite.html)它看起来不像它接受一个字符串输入。 – excaza 2014-09-10 12:02:24

+0

@excaza你是正确的,是否有任何方法来写一个修改后的char数据类型'new_claim'的XML文件? – Bini 2014-09-10 12:07:32

回答

0

xmlwrite是一个合作伙伴功能xmlread并与文档对象工作模型节点。如果你只想做一些简单的字符串替换,你可以这样做:

filename = 'myfile.svg'; 
XMLdata = fileread(filename); 

new_claim = strrep(XMLdata, 'Sans', 'Times New Roman'); 

fid = fopen(filename, 'w+'); 
fwrite(fid, new_claim); 
fclose(fid); 

没有必要重命名文件。 fileread只是将文件读入一个字符串。 strrep返回修改后的字符串,所以它实际上是new_claim,您希望将其保存到文件中。由于您只是使用字符串,因此可以使用fwrite将新字符串保存到文件。

+0

它工作的很好。有了这段代码,我能够替换SVG文件中的字体。谢谢 – Bini 2014-09-10 15:23:29

+0

这很棒,我很高兴它的工作。如果这能解决您的问题,那么您可以将其标记为答案? – sclarke81 2014-09-10 15:38:11

+0

当然。我已经标记了。感谢 – Bini 2014-09-10 16:07:54

0

这个问题似乎是所有空间(或换行符)似乎有已从.svg中删除,因此无法正确识别XML标记(例如:而不是<svg xmlns ...您有<svgxmlns ...这是应该由</svg>等)被关闭

这似乎是确定添加的空间\在需要的地方休息后:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!--CreatedwithInkscape(http://www.inkscape.org/)--> 
<svg 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:cc="http://creativecommons.org/ns#" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:svg="http://www.w3.org/2000/svg" 
    xmlns="http://www.w3.org/2000/svg" 
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" 
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" 
    width="64" 
    height="48" 
    id="svg3033" 
    version="1.1" 
    inkscape:version="0.48.5r10040" 
    sodipodi:docname="200mn.svg"> 
    <defs 
     id="defs3035"/> 
    <sodipodi:namedview 
     id="base" 
     pagecolor="#ffffff" 
     bordercolor="#666666" 
     borderopacity="1.0" 
     inkscape:pageopacity="0.0" 
     inkscape:pageshadow="2" 
     inkscape:zoom="5.916495" 
     inkscape:cx="61.898573" 
     inkscape:cy="54.220135" 
     inkscape:document-units="px" 
     inkscape:current-layer="layer1" 
     showgrid="false" 
     inkscape:window-width="1280" 
     inkscape:window-height="962" 
     inkscape:window-x="-8" 
     inkscape:window-y="-8" 
     inkscape:window-maximized="1"/> 
    <metadata 
     id="metadata3038"> 
     <rdf:RDF> 
      <cc:Work rdf:about=""> 
       <dc:format>image/svg+xml</dc:format> 
       <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> 
       <dc:title></dc:title> 
      </cc:Work> 
     </rdf:RDF> 
    </metadata> 
    <g 
     inkscape:label="Layer1" 
     inkscape:groupmode="layer" 
     id="layer1" 
     transform="translate(0,-1004.3622)"> 
     <text 
      xml:space="preserve" 
      style="font-size:28px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Calibri;-inkscape-font-specification:Calibri" 
      x="1.3270224e-007" 
      y="1035.7983" 
      id="text3049" 
      sodipodi:linespacing="125%"> 
       <tspan 
        sodipodi:role="line" 
        id="tspan3051" 
        x="1.3270224e-007" 
        y="1035.7983">200m</tspan> 
     </text> 
    </g> 
</svg> 
+0

谢谢你的回复。我得到了解决方案,这可以通过sclarke81回复的fwrite函数完成。我可以通过使用该代码来更改字体。我发现你的回复是信息丰富的,谢谢! – Bini 2014-09-10 16:12:37