【问题标题】:Receiving an error 'System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1.'收到错误“System.Xml.XmlException:根级别的数据无效。第 1 行,位置 1。
【发布时间】:2020-10-30 07:20:50
【问题描述】:

我知道标题中的错误消息表明我在其中运行 XML 代码的应用程序似乎没有将其识别为 XML。我已经将它与我最近使用的其他编码进行了比较,但找不到问题。然而,一个很大的不同是我同时使用了 XSLT,这可能是原因。我已经包含了 XML 和 XSLT 编码的片段以供参考。

    <?xml version="1.0" encoding="UTF-8"?>
        <GLPayrollExportConfiguration>
          <definitions>
            <FileType Value="CSV"/>
            <FileName>
              <Value Value="GL_Summary_"/>
              <Value Value="paygroup_xref"/>
              <Value Value="_"/>
              <Value Value="payrun_payperiod_and_suffix"/>
              <Value Value="_"/>
              <Value Value="transaction_timestamp"/>
              <Value Value=".csv"/>
            </FileName>
            <Settings>
              <SplitMode Value="HOME_LOCATION_SPLIT"/>
              <ChartOfAccountXRefCode Value="GL"/>
              <RunOnPayRunCommit Value="True"/>
           </Settings>
            <Header>
              <Text Value="Posting Date,"/>
              <Text Value="Document Type,"/>
              <Text Value="Account Type,"/>
              <Text Value="Account No,"/>
              <Text Value="Fund No,"/>
              <Text Value="Dimension Speedkey Code,"/>
              <Text Value="Dimension 1,"/>
              <Text Value="Dimension 2,"/>
              <Text Value="Dimension 3,"/>
              <Text Value="Dimension 4,"/>
              <Text Value="Dimension 5,"/>
              <Text Value="Dimension 6,"/>
              <Text Value="Dimension 7,"/>
              <Text Value="Dimension 8,"/>
              <Text Value="External Document No,"/>
              <Text Value="Description,"/>
              <Text Value="Amount,"/>
            </Header>
            <Columns>
              <Column Name="PostingDate" DataType="datetime" Source="data" Value="payrun_pay_date" Sort="true"/>
              <Column Name="ColumnC" DataType="string" Source="mapping"/> 
              <Column Name="AccountNo" DataType="string" Source="data" Value="payrun_category_override_journal_number"/>
              <Column Name="FundNo" DataType="string" Value="UNREST"/>
              <Column Name="DimensionSpeedkeyCode" DataType="string" Source="mapping"/>
              <Column Name="Description" DataType="string" Source="mapping"/>
              <Column Name="Amount" DataType="number" Source="data" Value="payrun_amount" Function="sum" />
            </Columns>
          </definitions>
          <MappingDefinitions>
            <definition>
            <criteriaset> 
        <!-- EXCLUDE MEMO DEDUCTIONS AND TAXABLE BENEFITS / JOURNAL NUMBER CODED AS exclude, Exclude, or EXCLUDE  -->   
                <criteria item="payrun_category_override_journal_number" op="ne">EXCLUDE</criteria>
                <criteria item="payrun_category_override_journal_number" op="ne">Exclude</criteria>
                <criteria item="payrun_category_override_journal_number" op="ne">exclude</criteria>
        <!-- EXCLUDE RECORDS WITH with 0 VALUE -->
                <criteria item="payrun_amount" op="ne" opDataType="number">0</criteria>
            </criteriaset>
            <mapping>
                <mapto columnname="Col C">
                  <Value Value="&#x0009;"/><Value Value="PAYROLL"/>
                  <Value Value="payrun_pay_date"/>
                </mapto>
                <mapto columnname="Dimension Speedkey Code">
                  <Value Value="&#x0009;"/><Value Value="override_segment_charged_dynamic_org_level_onsitedepartment"/>
                  <Value Value="override_segment_dynamic_labor_metric_code_CostNumber"/>
                </mapto>        
                <mapto columnname="Description">
                  <Value Value="&#x0009;"/><Value Value="payrun_pay_date"/>
                  <Value Value=" "/><Value Value="payrun_category_name"/>
                </mapto>        
            </mapping>
            </definition>   
          </MappingDefinitions>
          <ColumnFormats>
            <ColumnFormat Name="PostingDate" Format="MM.dd.yy"/>
            <ColumnFormat Name="ColC" Format="YYYYMMDD"/>
            <ColumnFormat Name="AccountNo" WrapChar="&quot;"/>
            <ColumnFormat Name="DimensionSpeedkeyCode" WrapChar="&quot;"/>
            <ColumnFormat Name="Description" Format="mm.dd.yy" WrapChar="&quot;"/>
            <ColumnFormat Name="Amount" Format="{0:##.00}"/>
          </ColumnFormats>
         </GLPayrollExportConfiguration>
    

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:template match="/">
                <xsl:choose>
                    <xsl:when test="override_segment_dynamic_labor_metric_code_CostNumber=' '">
                    <xsl:value-of select="override_segment_charged_dynamic_org_level_onsitedepartment"/>
                    </xsl:when>
                    <xsl:otherwise>
                    <xsl:value-of select="override_segment_dynamic_labor_metric_code_CostNumber"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:template>
        </xsl:stylesheet>

想法?

【问题讨论】:

  • 我用xsltproc 对其进行了测试,它没有抛出错误。但它也不会产生任何输出。
  • 在 XML 声明之前不允许有空格,很难判断您输入的 XML 示例中是否只是代码示例的缩进,或者确实是错误消息的原因。
  • Martin,我在 XML 声明之前没有任何空格。我也能够在没有错误的情况下运行该作业。数据库中有我正在运行代码的数据,但我没有得到输出文件,并且确实在作业日志中看到错误消息引用了标题字段中的错误。很奇怪。
  • 您的下游应用程序可能会生成错误消息,因为您的 XSLT 代码不会生成任何内容。因此,带有根节点的 XML 格式不正确。
  • 那么是否有编写执行 XSLT 转换的代码(例如 Java、C#)?一些 API,至少在 Microsoft 平台上,有两个方法 loadloadXML,人们会混淆它们并将 URI 或文件名传递给 loadXML 方法,然而,该方法期望 XML 标记作为字符串。这可能会导致这样的错误消息。 Bluewood 也有很好的提示。

标签: xml xslt xslt-1.0


【解决方案1】:

我不能重复错误。但是,您的选择块测试似乎总是会失败并默认为 &lt;xsl:otherwise&gt; 块。

when 测试的路径不正确,永远不会选择您想要的属性。 要获得成功的肮脏解决方案,您可以使用:

&lt;xsl:when test="//Value[@Value = 'override_segment_dynamic_labor_metric_code_CostNumber'] = ''"&gt;

// 通常是一种笨拙的方法。在这种情况下,//Value 会选择文档中的所有 Value 节点。

@Value 选择一个节点的属性,这是我唯一能找到您出现“override_segment_dynamic_labor_metric_code_CostNumber”的地方。

[] Xpath 中的方括号包含谓词 -- 或选择标准。

Value[@Value = 'override_segment_dynamic_labor_metric_code_CostNumber'] 返回谓词为真的Value 节点。

注意:我只是以// 为例说明它将如何成功。你真的应该为你的情况找到正确的路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多