架构验证发现非数据类型错误。
我阅读了手册,它提到这是由于外部列表数据库有一个。标记为不可为空的字段。 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>
答案 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",""));