我正在用c#创建XML文档。
我想通过XmlWriter
创建此输出。但是我无法获得确切的输出。
这是我需要生成的:
<ITRETURN:ITR xmlns:ITRETURN="http://incometaxindiaefiling.gov.in/main" xmlns:ITR1FORM="http://incometaxindiaefiling.gov.in/ITR1" xmlns:ITRForm="http://incometaxindiaefiling.gov.in/master" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ITR1FORM:ITR1>
<ITRForm:CreationInfo>
<ITRForm:SWVersionNo>R1</ITRForm:SWVersionNo>
<ITRForm:SWCreatedBy>SW92201920</ITRForm:SWCreatedBy>
<ITRForm:XMLCreatedBy>SW92201920</ITRForm:XMLCreatedBy>
<ITRForm:XMLCreationDate>2019-07-19</ITRForm:XMLCreationDate>
<ITRForm:IntermediaryCity>Delhi</ITRForm:IntermediaryCity>
<ITRForm:Digest>lOa90+jndV+RYN0ghOemod4eomQDqsSm6tw3w8XWsZQ= </ITRForm:Digest>
</ITRForm:CreationInfo>
</ITR1FORM:ITR1>
</ITRETURN:ITR>
如何使用XmlWriter
生成?
答案 0 :(得分:1)
您可以使用以下代码编写该XML:
// Namespace constants
var ITRETURN = @"http://incometaxindiaefiling.gov.in/main";
var ITR1FORM = @"http://incometaxindiaefiling.gov.in/ITR1";
var ITRForm = @"http://incometaxindiaefiling.gov.in/master";
var xsi = @"http://www.w3.org/2001/XMLSchema-instance";
// Enable indenting and disable the XML declaration.
var settings = new XmlWriterSettings
{
Indent = true,
IndentChars = " ",
OmitXmlDeclaration = true,
};
using (var xmlWriter = XmlWriter.Create(textWriter, settings))
{
// Write the start element and all namespaces.
xmlWriter.WriteStartElement("ITRETURN", "ITR", ITRETURN);
xmlWriter.WriteAttributeString("xmlns","ITRETURN", null, ITRETURN);
xmlWriter.WriteAttributeString("xmlns","ITR1FORM", null, ITR1FORM);
xmlWriter.WriteAttributeString("xmlns","ITRForm", null, ITRForm);
xmlWriter.WriteAttributeString("xmlns","xsi", null, xsi);
// Write the ITR1 element
xmlWriter.WriteStartElement("ITR1", ITR1FORM);
// Write the CreationInfo
xmlWriter.WriteStartElement("CreationInfo", ITRForm);
xmlWriter.WriteElementString("SWVersionNo", ITRForm, "R1");
xmlWriter.WriteElementString("SWCreatedBy", ITRForm, "SW92201920");
xmlWriter.WriteElementString("XMLCreatedBy", ITRForm, "SW92201920");
xmlWriter.WriteElementString("XMLCreationDate", ITRForm, "2019-07-19");
xmlWriter.WriteElementString("IntermediaryCity", ITRForm, "Delhi");
xmlWriter.WriteElementString("Digest", ITRForm, "lOa90+jndV+RYN0ghOemod4eomQDqsSm6tw3w8XWsZQ= ");
xmlWriter.WriteEndElement(); // CreationInfo
xmlWriter.WriteEndElement(); // ITR1
xmlWriter.WriteEndElement(); // ITR
}
注意:
在上面的代码textWriter
中是将要写入XML的某些StreamWriter
或StringWriter
。
使用指定名称空间中的元素直接编写XML时,通常应避免对名称空间 prefix 进行硬编码。而是使用采用本地名称和完整名称空间的XmlWriter
方法,例如XmlWriter.WriteStartElement(string localName, string ns)
或XmlWriter.WriteElementString(string localName, string ns, string value)
。
如果您确实需要对一些前缀进行硬编码,请参见this answer的Adding multiple namespace declarations in XmlWriter至 Ryan B 以获得有关如何编写必要属性的说明)。您还需要使用XmlWriter.WriteStartElement(string prefix, string localName, string ns)
手动为声明了的名称空间的元素(此处是根元素)写一个前缀。但是一旦定义了前缀,所有子元素都将自动选择它们。
(不必对前缀进行硬编码。只要接收系统正确解析了XML名称空间,使用的前缀就无关紧要。当然,并非所有接收系统都正确解析XML ...)
< / li>我对XML进行了缩进,并省略了XML声明,如您的问题所示。
如果Digest
实际上是生产代码中的字节数组,则可以使用XmlWriter.WriteBase64(byte[] buffer, int index, int count)
轻松将其写为Base64。
演示小提琴here。