使用 XmlTextWriter 设置多个命名空间
set multiple namespaces with XmlTextWriter
我正在尝试创建一个信息路径表单 XML 文件。我最初是按照这个例子 programmatically-create-infopath-form-console-app 但我遇到了多个命名空间的问题。
这是我的信息路径表单中的一些命名空间 XML 文件
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls"
xmlns:dms="http://schemas.microsoft.com/office/2009/documentManagement/types"
在大多数情况下,当我按照示例进行操作时,一切都进行得很顺利,直到我阅读 XML 文件的人员选择器部分。
我想要的:
<my:Updated_By>
<pc:Person>
<pc:DisplayName></pc:DisplayName>
<pc:AccountId></pc:AccountId>
<pc:AccountType></pc:AccountType>
</pc:Person>
</my:Updated_By>
我做了什么(一):
string myNamespace = "http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-09-02T01:11:44";
...
writer.WriteStartElement("my", "myFields", myNamespace);
writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
writer.WriteAttributeString("xmlns", "pc", null, "http://schemas.microsoft.com/office/infopath/2007/PartnerControls");
...
writer.WriteStartElement("my", "Updated_By", myNamespace);
writer.WriteStartElement("pc", "Person");
writer.WriteEndElement();
writer.WriteStartElement("pc", "DisplayName");
writer.WriteEndElement();
writer.WriteStartElement("pc", "AccountId");
writer.WriteEndElement();
writer.WriteStartElement("pc", "AccountType");
writer.WriteEndElement();
writer.WriteEndElement();
...
我得到的(1):
<my:Updated_By>
<pc xmlns="Person" />
<pc xmlns="DisplayName" />
<pc xmlns="AccountId" />
<pc xmlns="AccountType" />
</my:Updated_By>
我不确定 "xmlns=" 是否对 XML 文件有任何影响,但我希望它看起来尽可能接近由 XML 生成的文件信息路径
解决这个问题的正确方法是什么?
我会使用 Xml Linq。请参阅下面的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string header = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
"<my:Updated_By xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
" xmlns:pc=\"http://schemas.microsoft.com/office/infopath/2007/PartnerControls\"" +
" xmlns:dms=\"http://schemas.microsoft.com/office/2009/documentManagement/types\"" +
" xmlns:my=\"http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-09-02T01:11:44\">" +
"</my:Updated_By>";
XDocument doc = XDocument.Parse(header);
XElement root = doc.Root;
XNamespace pcNs = root.GetNamespaceOfPrefix("pc");
string name = "John";
string id = "123";
string type = "person";
root.Add(new XElement(pcNs + "Person",
new XElement(pcNs + "DisplayName", name),
new XElement(pcNs + "AccountId", id),
new XElement(pcNs + "AccountType", type)
));
doc.Save("filename");
}
}
}
我正在尝试创建一个信息路径表单 XML 文件。我最初是按照这个例子 programmatically-create-infopath-form-console-app 但我遇到了多个命名空间的问题。
这是我的信息路径表单中的一些命名空间 XML 文件
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls"
xmlns:dms="http://schemas.microsoft.com/office/2009/documentManagement/types"
在大多数情况下,当我按照示例进行操作时,一切都进行得很顺利,直到我阅读 XML 文件的人员选择器部分。
我想要的:
<my:Updated_By>
<pc:Person>
<pc:DisplayName></pc:DisplayName>
<pc:AccountId></pc:AccountId>
<pc:AccountType></pc:AccountType>
</pc:Person>
</my:Updated_By>
我做了什么(一):
string myNamespace = "http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-09-02T01:11:44";
...
writer.WriteStartElement("my", "myFields", myNamespace);
writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
writer.WriteAttributeString("xmlns", "pc", null, "http://schemas.microsoft.com/office/infopath/2007/PartnerControls");
...
writer.WriteStartElement("my", "Updated_By", myNamespace);
writer.WriteStartElement("pc", "Person");
writer.WriteEndElement();
writer.WriteStartElement("pc", "DisplayName");
writer.WriteEndElement();
writer.WriteStartElement("pc", "AccountId");
writer.WriteEndElement();
writer.WriteStartElement("pc", "AccountType");
writer.WriteEndElement();
writer.WriteEndElement();
...
我得到的(1):
<my:Updated_By>
<pc xmlns="Person" />
<pc xmlns="DisplayName" />
<pc xmlns="AccountId" />
<pc xmlns="AccountType" />
</my:Updated_By>
我不确定 "xmlns=" 是否对 XML 文件有任何影响,但我希望它看起来尽可能接近由 XML 生成的文件信息路径
解决这个问题的正确方法是什么?
我会使用 Xml Linq。请参阅下面的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string header = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
"<my:Updated_By xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
" xmlns:pc=\"http://schemas.microsoft.com/office/infopath/2007/PartnerControls\"" +
" xmlns:dms=\"http://schemas.microsoft.com/office/2009/documentManagement/types\"" +
" xmlns:my=\"http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-09-02T01:11:44\">" +
"</my:Updated_By>";
XDocument doc = XDocument.Parse(header);
XElement root = doc.Root;
XNamespace pcNs = root.GetNamespaceOfPrefix("pc");
string name = "John";
string id = "123";
string type = "person";
root.Add(new XElement(pcNs + "Person",
new XElement(pcNs + "DisplayName", name),
new XElement(pcNs + "AccountId", id),
new XElement(pcNs + "AccountType", type)
));
doc.Save("filename");
}
}
}