【问题标题】:Can not save char data to xml file in MATLAB无法在 MATLAB 中将 char 数据保存到 xml 文件
【发布时间】:2014-11-04 01:27:24
【问题描述】:

我想在 MATLAB 中修改一个 svg 文件的 xml 文本信息。 我将 svg 文件重命名为 xml 文件

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

得到 XML 文本信息:

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

XMLdata 是一个包含 XML 文本信息的 char 数组 现在我可以使用 strcmp 修改 XMLdata,例如:

    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',...

【问题讨论】:

  • 我没有任何使用xmlwrite 的经验,但是看着the documentation 它似乎不接受字符串输入。
  • @excaza 你是对的,有没有什么方法可以用修改后的 char 数据类型'new_claim'编写一个 xml 文件?

标签: java xml matlab dom svg


【解决方案1】:

xmlwritexmlread 的合作伙伴函数,并与文档对象模型节点一起使用。如果你想做的只是一些简单的字符串替换,你可以这样做:

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 可用于将新字符串保存到文件中。

【讨论】:

  • 效果很好。使用此代码,我可以替换 SVG 文件中的字体。谢谢
  • 太好了,我很高兴它成功了。如果这确实解决了您的问题,也许您可​​以将其标记为答案?
  • 你能告诉我在MATLAB中以图形方式查看这个svg文件的任何解决方案
  • 我认为这是一个新问题的主题。不要忘记在您的问题中包含您的 svg 文件示例,作为托管在外部网站上的下载文件或将文件内容的简短版本粘贴到问题中。
【解决方案2】:

问题似乎是所有空格(或换行符)似乎已从您的 .svg 中删除,因此无法正确识别 XML 标记(例如:您使用 &lt;svgxmlns ... 而不是 &lt;svg xmlns ...应该由&lt;/svg&gt;等关闭)

在需要的地方添加空格\中断后似乎没问题:

<?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>

【讨论】:

  • 谢谢您的回复。我得到了解决方案,这可以通过 sclarke81 回复的 fwrite 函数来完成。我可以使用该代码更改字体。我发现您的回复内容丰富,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多