代码之家  ›  专栏  ›  技术社区  ›  Howdy

如何在使用快速XML解析器构建XML时包含属性值?

  •  1
  • Howdy  · 技术社区  · 2 年前

    快速xml解析器4.3.6版

    描述

    我需要包含xml属性(标记化=“true”),如下所示: <custom-tag tokenized="true">test test &gt; 14</custom-tag>

    输入

    密码

    var defaultXmlOptions = {
          ignoreAttributes: false,
          attributeNamePrefix: "@_",
          indentBy: "  ",
          textNodeName: "#text",
          format: true,
      },
    var testJson = { component: {
          "custom-tag": {
              "#text": "test test > 14",
              "@_tokenized": true
          }
      }}
    

    以下是转换的代码:

    var parser = new XMLBuilder(defaultXmlOptions);
    var xml = parser.build(testJson);
    

    输出

    <component>
      <custom-tag tokenized>test test &gt; 14</custom-tag>
    </component>
    

    该属性应具有=“true”

    预期输出

    <component>
      <custom-tag tokenized="true">test test &gt; 14</custom-tag>
    </component>
    

    过去有效的旧代码

    var Parser = require("fast-xml-parser").j2xParser;
    var parser = new Parser(defaultXmlOptions);
    var xml = parser.parse(testJson);
    

    现在将我的项目从CRA转换为Vite不能使用require。

    2 回复  |  直到 2 年前
        1
  •  2
  •   AngYC    2 年前

    你缺少的是选项 suppressBooleanAttributes 在XMLBuilder中。默认情况下,布尔属性如 true 将在构建的XML中省略其值。

    function demo() {
      var defaultXmlOptions = {
        ignoreAttributes: false,
        attributeNamePrefix: "@_",
        indentBy: "  ",
        textNodeName: "#text",
        format: true,
        // You need this to preserve boolean values!
        suppressBooleanAttributes: false,
      };
      var testJson = {
        component: {
          "custom-tag": {
            "#text": "test test > 14",
            "@_tokenized": true
          }
        }
      };
    
      var parser = new XMLBuilder(defaultXmlOptions);
      var xml = parser.build(testJson);
      console.log(xml);
    }
    
    document.addEventListener("readystatechange", () => document.readyState === "complete" && demo());
    <script type="module">
      import { XMLBuilder } from 'https://cdn.jsdelivr.net/npm/[email protected]/+esm';
      window.XMLBuilder = XMLBuilder;
    </script>
        2
  •  1
  •   Roy Art    2 年前

    设置 suppressBooleanAttributes false .

    您也可以使用 attributeValueProcessor 。事实上,简单地做:

    attributeValueProcessor: (value, attrName) => {
      return value;
    }
    

    会打印值,但如果你不需要在那里做任何有趣的事情, suppressBoolean属性 是您的最佳选择。