Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从XPathNavigator.AppendChild()创建XmlWriter.XmlWriterSettings时如何设置?_C#_Xml Serialization_Xmlserializer_Xmlwriter - Fatal编程技术网

C# 从XPathNavigator.AppendChild()创建XmlWriter.XmlWriterSettings时如何设置?

C# 从XPathNavigator.AppendChild()创建XmlWriter.XmlWriterSettings时如何设置?,c#,xml-serialization,xmlserializer,xmlwriter,C#,Xml Serialization,Xmlserializer,Xmlwriter,我需要将XmlWriter的XmlWriterSettings的OmitXmlDeclaration属性设置为false,以便不创建XML声明。问题是我通过调用XPathNavigator.AppendChild()方法创建了XmlWriter。代码如下: public String GetEntityXml<T>(List<T> entities) { XmlDocument xmlDoc = new XmlDocument();

我需要将XmlWriter的XmlWriterSettings的OmitXmlDeclaration属性设置为false,以便不创建XML声明。问题是我通过调用XPathNavigator.AppendChild()方法创建了XmlWriter。代码如下:

    public String GetEntityXml<T>(List<T> entities)
    {
        XmlDocument xmlDoc = new XmlDocument();
        XPathNavigator nav = xmlDoc.CreateNavigator();

        using (XmlWriter writer = nav.AppendChild())
        {

            XmlSerializer ser = new XmlSerializer(typeof(List<T>), new XmlRootAttribute(typeof(T).Name + "_LIST"));
            ser.Serialize(writer, entities);
        }

        StringWriter stringWriter = new StringWriter();
        XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);

        xmlDoc.WriteTo(xmlTextWriter);

        string resultString = stringWriter.ToString();

        stringWriter.Close();
        xmlTextWriter.Close();

        return resultString;
    }
公共字符串GetEntityXml(列出实体)
{
XmlDocument xmlDoc=新的XmlDocument();
XPathNavigator nav=xmlDoc.CreateNavigator();
使用(XmlWriter=nav.AppendChild())
{
XmlSerializer ser=newXmlSerializer(typeof(List),newXmlRootAttribute(typeof(T).Name+“_List”);
序列化(编写器、实体);
}
StringWriter StringWriter=新StringWriter();
XmlTextWriter XmlTextWriter=新的XmlTextWriter(stringWriter);
xmlDoc.WriteTo(xmlTextWriter);
string resultString=stringWriter.ToString();
stringWriter.Close();
xmlTextWriter.Close();
返回结果字符串;
}
知道如何序列化列表而不使用XML声明吗?

试试这种方法(为了可读性切换到
var
):

公共字符串GetEntityXml(列出实体)
{
var xmlDoc=新的XmlDocument();
var nav=xmlDoc.CreateNavigator();
使用(var sw=new StringWriter())
{
//创建一个将省略xml声明的XmlWriter
var s=新的XmlWriterSettings{OmitXmlDeclaration=true};
使用(var xmlWriter=xmlWriter.Create(sw,s))
{
//使用以下命令可以在没有名称空间的情况下序列化
var ns=新的XmlSerializerNamespaces();
加上(“,”);
var ser=新的XmlSerializer(typeof(List),
新的XmlRootAttribute(typeof(T).Name+“_列表”);
序列化(xmlWriter、实体、ns);
}
//将xml字符串传递给nav.AppendChild()
nav.AppendChild(sw.ToString());
}
使用(var stringWriter=new stringWriter())
{
使用(var xmlTextWriter=XmlWriter.Create(stringWriter))
{
xmlDoc.WriteTo(xmlTextWriter);
}
返回stringWriter.ToString();
}
}

与使用
nav.AppendChild()
创建
XmlWriter
不同,您可以单独创建
XmlWriter
,然后使用
nav.AppendChild(string)
将XML写入
xmlDoc
。当您自己创建
XmlWriter
时,可以省略XML声明。此外,当您序列化时,您可能希望使用
xmlserializernamespace
类省略
xmlns:xsi
xmlns:xsd
名称空间。

执行代码时,我没有得到XML声明。序列化
列表
可以提供:

<Int32_LIST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <int>5</int>
  <int>7</int>
  <int>2</int>
</Int32_LIST>
如果您引用的是
xmlns
部分,则这些部分称为“XML命名空间声明”,可以通过使用默认空命名空间初始化
xmlsializernamespace
实例并将其传递给
Serialize
方法来消除:

XmlSerializer ser = new XmlSerializer(typeof(List<T>), new XmlRootAttribute(typeof(T).Name + "_LIST"));
var namespaces = new XmlSerializerNamespaces(new[] { new XmlQualifiedName("", "") });
ser.Serialize(writer, entities, namespaces);
XmlSerializer ser=newxmlserializer(typeof(List),newxmlrootattribute(typeof(T).Name+“_List”);
var namespaces=new-XmlSerializerNamespaces(new[]{new-XmlQualifiedName(“,”)});
序列化(编写器、实体、名称空间);
下面是一个缩短的实现,它实现了与代码相同的结果:

public String GetEntityXml<T>(List<T> entities)
{
    var sb = new StringBuilder();
    var settings = new XmlWriterSettings { OmitXmlDeclaration = true };
    using (XmlWriter writer = XmlWriter.Create(sb, settings))
    {
        XmlSerializer ser = new XmlSerializer(typeof(List<T>), new XmlRootAttribute(typeof(T).Name + "_LIST"));
        var namespaces = new XmlSerializerNamespaces(new[] { new XmlQualifiedName("", "") });
        ser.Serialize(writer, entities, namespaces);
    }
    return sb.ToString();
}
公共字符串GetEntityXml(列出实体)
{
var sb=新的StringBuilder();
var设置=新的XmlWriterSettings{OmitXmlDeclaration=true};
使用(XmlWriter=XmlWriter.Create(sb,设置))
{
XmlSerializer ser=newXmlSerializer(typeof(List),newXmlRootAttribute(typeof(T).Name+“_List”);
var namespaces=new-XmlSerializerNamespaces(new[]{new-XmlQualifiedName(“,”)});
序列化(编写器、实体、名称空间);
}
使某人返回字符串();
}

我认为示例代码有点误导。我假设他试图将子项添加到已经存在的XML文档中,在这种情况下,
XmlSerializer
会写出XML声明并导致其示例代码崩溃。以示例代码为例,在声明xmlDoc之后添加以下内容,您将看到我的意思:
xmlDoc.LoadXml(“”);var nav=xmlDoc.DocumentElement.CreateNavigator()是的,可能是这样。鉴于他已经知道可以直接初始化
XmlWriter
,创建
XPathNavigator
似乎太没有意义了。-1:请用
XmlWriter.Create()
替换
新的XmlTextWriter()
,我会投票。@JohnSaunders更新,但我只是从OP复制代码。我认为代码的这一部分与他提出的问题无关我敢肯定,他正在试图弄清楚如何将序列化的xml插入到现有的xml文档中(因为有更简单的方法来编写
GetEntityXml
方法,正如另一个答案明确指出的那样)。+1读者复制并粘贴我们发布的代码,即使我们打算将其作为其他内容的示例。顺便说一句,我让你不用
使用
块,因为我心情很好。我听说你也会更新的。为了说明我所建议的更改,我尽量不偏离原文太远,但我明白你的意思。在我的回答中,我假设你试图将序列化的xml添加到现有文档中。是这样吗?另外,您是否需要从resultString中省略xml声明?rsbarro——您是正确的。我正在考虑获取实体集合的xml序列化,然后将其添加到具有多个序列化的组合文档中。
XmlSerializer ser = new XmlSerializer(typeof(List<T>), new XmlRootAttribute(typeof(T).Name + "_LIST"));
var namespaces = new XmlSerializerNamespaces(new[] { new XmlQualifiedName("", "") });
ser.Serialize(writer, entities, namespaces);
public String GetEntityXml<T>(List<T> entities)
{
    var sb = new StringBuilder();
    var settings = new XmlWriterSettings { OmitXmlDeclaration = true };
    using (XmlWriter writer = XmlWriter.Create(sb, settings))
    {
        XmlSerializer ser = new XmlSerializer(typeof(List<T>), new XmlRootAttribute(typeof(T).Name + "_LIST"));
        var namespaces = new XmlSerializerNamespaces(new[] { new XmlQualifiedName("", "") });
        ser.Serialize(writer, entities, namespaces);
    }
    return sb.ToString();
}