如何保存XML文件而不在空的打开和关闭标签之间添加换行符?

时间:2019-08-30 20:58:39

标签: c# xml sharepoint infopath

架构验证发现非数据类型错误。

我阅读了手册,它提到这是由于外部列表数据库有一个。标记为不可为空的字段。 b。该字段可以接受空字符串作为有效输入。

在下面的情况下,“总和”是必填项,而其他五个字段不是必需的。

XmlDocument.Save(pathToFile)成功保存了具有所需更改的文档,但是当尝试从SharePoint中打开InfoPath时,架构将变得无效。

我将原始格式与更新后的格式进行了比较。保存后,所有空节点都有一个换行符。从原始文本到更新文本的逐行检查没有显示任何其他更改。我可以将原始文本复制回更新的文件中,将更改手动添加到my:Sum中,然后按预期加载表单。

保存后,我可以按预期在SP列表项中看到数据:我只是无法在InfoPath中打开该项。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;

static void Main(string[] args)
{
    string[] xmlFiles = Directory.GetFiles(@"\\path\to\files");

    foreach(string fileName in xmlFiles)
    {

        FileInfo theFile = new FileInfo(fileName);

        XmlDocument xml = new XmlDocument();

        using(FileStream fs = theFile.Open(FileMode.Open, FileAccess.ReadWrite))
        {
            xml.Load(fs);
        }

        XPathNavigator navigator = xml.CreateNavigator();

        XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
        manager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2017-04-19T15:13:18");

        List<string> List1 = new List<string>();
        List<string> List2 = new List<string>();
        List<string> List3 = new List<string>();
        List<string> List4 = new List<string>();
        List<string> List5 = new List<string>();

        foreach(XPathNavigator nav in navigator.Select("//my:Field1", manager))
        {
            List1.Add(nav.Value);
        } /*repeated for all five lists*/

        int i = 0;
        decimal currentSum = Decimal.Zero;
        foreach(XPathNavigator nav in navigator.Select("//my:Sum", manager))
        {
            currentSum = Decimal.Zero;
            currentSum += string.IsNullOrWhiteSpace(List1[i]) ? Decimal.Zero : Convert.ToDecimal(List1[i]); /*repeated for all 5 lists*/

            nav.SetValue(currentSum.ToString());
            i++;
        }

        xml.Save(fileName);
    }

    Console.ReadLine();
}

原始-空节点中没有换行符

<?xml version="1.0" encoding="utf-8"?>
<three more lines of infopath generated headers>
<my:myFields>
    <my:Details>
        <my:Field1>1</my:Field1>
        <my:Field2>2</my:Field2>
        <my:Field3>3</my:Field3>
        <my:Field4>4</my:Field4>
        <my:Field5 xsi:nil="true"></my:Field5>
        <my:Sum>0</my:Sum>
    </my:Details>
    <my:Details>
        <my:Field1 xsi:nil="true"></my:Field1>
        <my:Field2>2</my:Field2>
        <my:Field3>3</my:Field3>
        <my:Field4>4</my:Field4>
        <my:Field5 xsi:nil="true"></my:Field5>
        <my:Sum>0</my:Sum>
    </my:Details>
</my:myFields>

已更新-所有空节点中的换行符,无论是否标记为nil。

<?xml version="1.0" encoding="utf-8"?>
<three more lines of infopath generated headers>
<my:myFields>
    <my:Details>
        <my:Field1>1</my:Field1>
        <my:Field2>2</my:Field2>
        <my:Field3>3</my:Field3>
        <my:Field4>4</my:Field4>
        <my:Field5 xsi:nil="true">
        </my:Field5>
        <my:Sum>10</my:Sum>
    </my:Details>
    <my:Details>
        <my:Field1 xsi:nil="true">
        </my:Field1>
        <my:Field2>2</my:Field2>
        <my:Field3>3</my:Field3>
        <my:Field4>4</my:Field4>
        <my:Field5 xsi:nil="true">
        </my:Field5>
        <my:Sum>9</my:Sum>
    </my:Details>
</my:myFields>

2 个答案:

答案 0 :(得分:0)

我不知道.NET上有什么可用,并且可能有一种更简单的方法,但是一个选择是用空的XSLT转换替换“保存”:通过一个简单的样式表放入它:

<xsl:template match="/"><xsl:copy-of select="."/></xsl:template>
<xsl:output method="xml" indent="no"/>

通常,Microsoft XML工具在添加或删除空白方面有点过分。

答案 1 :(得分:0)

清空标签时设置特定的标志字来清空它。

if (string.IsNullOrEmpty(text)){ text = "need_to_be_blank";}
GetRootNode(Xpath).CurrentNode.InnerText = text;

然后保存后,将所有标志字替换为“”

_xmlDoc.Save(filePath);
string readText = File.ReadAllText(filePath);
File.WriteAllText(filePath, readText.Replace("need_to_be_blank",""));