我正在尝试添加一些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
答案 0 :(得分:1)
这里有两个基本问题。
首先,当您创建XML elements时,您正在创建name
,tag1
和tag2
作为子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。