使用XmlDocument

时间:2018-02-21 19:17:59

标签: c# xml

我正在尝试添加一些XML文件。我正在以一种格式(下面的Format2)添加XML,并希望将其转换为另一种格式(下面的Format1)。我怎么能这样做?

详细信息:

我有一个template.xml我用来创建文件,所以我可以将它导入一个特殊的应用程序,只需更新现有的属性xml。但是,根据某些情况,需要添加更多元素和属性。

XML的简化示例如下:

<?xml version="1.0"?>
<chssystem ExportDate="2/21/2018" ExportTime="2:57 PM EST" DateFormat="MM/dd/yyyy" NumberFormat="HH:mm:ss " SchemaValidation="true" ExportVersion="2016.1.SP1710.57" xmlns="http://www.mentor.com/harness/Schema/LibrarySchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mentor.com/harness/Schema/LibrarySchema file:/C:/MentorGraphics/VeSys_Client/dtd/LibrarySchema.xsd" XMLVersion="1.6">

  <librarycomponenttype librarycomponenttype_id="_GROUPID_CONNECTOR" description="Connector" clipgromident="" typecode="CONN" />

  <connectorpart libraryobject_id="_OID_CTEST"  depth="0.0" description="TEST DATA" graphics="0" groupname="Connector" librarycomponenttype_id="_GROUPID_CONNECTOR"  cavityqt="1"  partnumber="CONN-C-TEST"   unitofmeasure="Each"  >
        <librarycavity librarycavity_id="ID1" ca_mappingtype="Userdefined" ca_attach=" " isblocked="1" pingraphic=" " cavityname="1" librarypincontainer_id="_OID_CTEST" sortorder="1"/>
  </connectorpart>

</chssystem>

我们想要添加 Format1

<subsystem name="hahaha" 
tag1="NoNo"tag2="SoNo" />

以下是我用来创建此元素的c#代码:

XmlElement subsystem = xmlDoc.CreateElement("subsystem");

XmlElement name= xmlDoc.CreateElement("name");
name.InnerText = "hahaha";

XmlElement tag1= xmlDoc.CreateElement("tag1");
tag1.InnerText = "NoNo";

XmlElement tag2= xmlDoc.CreateElement("tag2");
tag2.InnerText = "SoNo";

在我添加它们之后,我有一个新的XML,其中包含以下 Format2

<subsystem xmlns="">
  <name>hahaha</name>
  <tag1>NoNo</tag1>
  <tag2>SoNo</tag2>
</subsystem >

因此C#代码添加了额外的xmlns=""

在有或没有额外xmlns=""

的情况下,应用程序仍会返回错误

如果我手动将数据调整为Format1,则没有错误~~~~&gt;如果我可以将 Format2 转换为 Format1 ,我认为该应用程序将接受xml

来自应用程序的错误: 如果我保留xmlns="",则会出现错误消息 Invalid content was found starting with element subsystem, the element name is needed

如果我删除xmlns="",则会出现错误消息 element name must appear on subsystem, element tag1 must appear on subsystem, element tag2 must appear on subsystem

1 个答案:

答案 0 :(得分:1)

这里有两个基本问题。

首先,当您创建XML elements时,您正在创建nametag1tag2作为子XML attributes }。即下面的两个XML片段不相同,因为第一个中的<name>hahaha</name>是元素,而name="hahaha"不是:

<subsystem>
  <name>hahaha</name>
</subsystem>

<subsystem name="hahaha" />

在您当前的代码中,您正在创建元素,但您应该创建XmlAttribute个对象,例如与XmlDocument.CreateAttribute()

(有关元素和属性之间差异的概述,请参阅例如 XSD: difference between Element and Attribute XML attribute vs XML element 。)

其次,您使用XmlDocument.CreateElement(string qualifiedName)在空命名空间中创建<subsystem>节点。但是,由于存在<chssystem>属性,根元素"http://www.mentor.com/harness/Schema/LibrarySchema"属于xmlns="http://www.mentor.com/harness/Schema/LibrarySchema"命名空间。因此,您需要在同一名称空间中创建<subsystem>节点,例如与XmlDocument.CreateElement(String qualifiedName, String namespaceURI)

(有关XML命名空间的概述,请参阅例如 What are XML namespaces for? 。)

针对这两个问题的修复是修改代码以正确创建<subsystem>,而不是错误地创建它并尝试对其进行转换。以下代码应该完成这项工作:

// Get the XML namespace of the root element.
var namespaceURI = xmlDoc.DocumentElement.NamespaceURI;

// Create the subsystem in the same XML namespace
var subsystem = xmlDoc.DocumentElement.AppendChild(xmlDoc.CreateElement("subsystem", namespaceURI));

// Add the specified attributes.
subsystem.Attributes.Append(xmlDoc.CreateAttributeWithValue("name", "hahaha"));
subsystem.Attributes.Append(xmlDoc.CreateAttributeWithValue("tag1", "NoNo"));
subsystem.Attributes.Append(xmlDoc.CreateAttributeWithValue("tag2", "SoNo"));

它使用扩展方法:

public static class XmlNodeExtensions
{
    public static XmlAttribute CreateAttributeWithValue(this XmlDocument doc, string name, string value)
    {
        var attr = doc.CreateAttribute(name);
        attr.Value = value;
        return attr;
    }
}

并生成以下XML:

<chssystem ExportDate="2/21/2018" ExportTime="2:57 PM EST" DateFormat="MM/dd/yyyy" NumberFormat="HH:mm:ss " SchemaValidation="true" ExportVersion="2016.1.SP1710.57" xmlns="http://www.mentor.com/harness/Schema/LibrarySchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mentor.com/harness/Schema/LibrarySchema file:/C:/MentorGraphics/VeSys_Client/dtd/LibrarySchema.xsd" XMLVersion="1.6">
  <librarycomponenttype librarycomponenttype_id="_GROUPID_CONNECTOR" description="Connector" clipgromident="" typecode="CONN" />
  <connectorpart libraryobject_id="_OID_CTEST" depth="0.0" description="TEST DATA" graphics="0" groupname="Connector" librarycomponenttype_id="_GROUPID_CONNECTOR" cavityqt="1" partnumber="CONN-C-TEST" unitofmeasure="Each">
    <librarycavity librarycavity_id="ID1" ca_mappingtype="Userdefined" ca_attach=" " isblocked="1" pingraphic=" " cavityname="1" librarypincontainer_id="_OID_CTEST" sortorder="1" />
  </connectorpart>
  <subsystem name="hahaha" tag1="NoNo" tag2="SoNo" />
</chssystem>

示例工作.Net fiddle