C# 向xml添加节点 或者说添加一个不同数据结构的表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 向xml添加节点 或者说添加一个不同数据结构的表相关的知识,希望对你有一定的参考价值。
原表
添加后
帮你写好了,截图和核心代码我发在这里,整个项目我放在附件里,如有疑问欢迎追问。
核心代码:
public static void AppendContent(ContentData contentData)// Load xml file into memory
var xml = new XmlDocument();
xml.Load("MyXml.xml");
// select the root of the xml file
var root = xml.SelectSingleNode("NewDataSet");
// create content data node
var contentDataNode = xml.CreateElement("ContentData");
// create content data node, and assign the corresponding value
var idNode = xml.CreateElement("ID");
idNode.InnerText = contentData.ID.ToString();
// create content data node, and assign the corresponding value
var contentNode = xml.CreateElement("Content");
contentNode.InnerText = contentData.Content;
// create content data node, and assign the corresponding value
var parentIdNode = xml.CreateElement("ParentID");
parentIdNode.InnerText = contentData.ParentID.ToString();
// append three child nodes to the parent node(contentDataNode)
contentDataNode.AppendChild(idNode);
contentDataNode.AppendChild(contentNode);
contentDataNode.AppendChild(parentIdNode);
// append contentDataNode to the root
root.AppendChild(contentDataNode);
// save the file
xml.Save("MyXml.xml");
关键截图:
添加新节点前:
运行程序添加节点:
添加节点后:
我把你的代码复制的按钮事件里不行,真的不会 搞晕了
追答我给你的是控制台,你不能直接复制到Button事件中
参考技术A 原XML文件<DataSet>
<TreeData>
<ID>1</ID>
<ParentID>0</ParentID>
</TreeData>
</DataSet>
执行代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Threading.Tasks;
namespace CreatXmlNode
class Program
static void Main(string[] args)
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load("C:/Users/qcli/Desktop/aaa.xml");
XmlNode dataSet = xmlDocument.SelectSingleNode("DataSet");
XmlElement dataSetEle = (XmlElement)dataSet;
XmlElement contentData = xmlDocument.CreateElement("ContentData");
XmlElement iD = xmlDocument.CreateElement("ID");
iD.InnerText = "8";
XmlElement content = xmlDocument.CreateElement("Content");
content.InnerText = "内容";
XmlElement parentID = xmlDocument.CreateElement("ParentID");
parentID.InnerText = "0";
contentData.AppendChild(iD);
contentData.AppendChild(content);
contentData.AppendChild(parentID);
dataSetEle.AppendChild(contentData);
xmlDocument.Save("C:/Users/qcli/Desktop/aaa.xml");
执行结果:
<DataSet>
<TreeData>
<ID>1</ID>
<ParentID>0</ParentID>
</TreeData>
<ContentData>
<ID>8</ID>
<Content>内容</Content>
<ParentID>0</ParentID>
</ContentData>
</DataSet>
刚写完,可以作为参考。追问
不行啊 搞不来
追答XDocument root = new XDocument(path);//这是加载你自己的XML文件,path为文件的地址
思路是将你要添加的节点添加到对应的节点后面或者下面
XElement xele = root.Element("TreeDate");//你需要的是将ContentDate添加到这个节点的下面,与这个节点是同级的,现在是获取这个节点,然后新建ContentDate这个节点
XElement content = new XElement("ContentDate",
new XElement("ID", 1),
new XElement("Content", "这是内容"),
new XElement("ParentID", "1")
);
然后将这个创建的节点添加到TreeDate节点后面
xele.AddAfterSelf(content);
root.Save(path);//保存XML文件
纯手打,如果楼主还是不懂的话,可以将我的代码直接复制进去运行一下看看,注意XML文件的路径别写错了,声明一下,我没有测试这些代码,如果有错误或者是楼主还需要探讨一番,烦请追问
有错误,求解
//加载XML文档,(路径一定要对)
XElement root = XElement.Load("C:\\diantidatas.xml");
//创建自己的节点
XElement content = new XElement("ContentDate",
new XElement("ID", 1),
new XElement("Content", "这是内容"),
new XElement("ParentID", "1")
);
//将创建的节点加到最后一个节点的后面
root.LastNode.AddAfterSelf(content);
//保存操作的文档
root.Save("C:\\diantidatas.xml");
以上代码为亲手编写测试,楼主再试试,如果有任何问题咱们再探讨
谢谢! 试过了确实可以 我现在想修改("Content", "这是内容" )这个节点属性改成("Content", "XXX") 可否指教 看书看不懂
追答没有问题的,("Content","这是内容"),前面的"Content"是节点的名字,后面的"这是内容"表示的是这个节点的值,也就是写入XML文件后会显示成这是内容,所以随便修改都没有关系,欢迎随时探讨,小生知无不言言无不尽
本回答被提问者采纳我们如何识别一组节点并将该组添加到另一个 XSLT 中 XML 源结构不同的节点?
【中文标题】我们如何识别一组节点并将该组添加到另一个 XSLT 中 XML 源结构不同的节点?【英文标题】:How do we identify a set of nodes and add that set into another where the structure of XML source vary in XSLT? 【发布时间】:2017-01-01 13:24:52 【问题描述】:我正在尝试将基于 Flash 的文本格式转换为基于 HTML 的文本。
源 xml 中有 <LI></LI>
块,我需要在 <ul>
块内添加相邻的 <LI>
块。
<p></p>
<li></li> ------
<li></li> | - should be wrapped with <ul> tag
<li></li> ------
<p></p>
<li></li>
<li></li>
<li></li>
<p></p>
XML 源代码
<root>
<TEXTFORMAT LEADING="2">
<P ALIGN="LEFT">
edfg
</P>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<P ALIGN="LEFT">
sdgfdsgsds
</P>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<LI>
sdfgdsg
</LI>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<LI>
dsgdfgdsfg
</LI>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<LI>
<FONT FACE="Lato" SIZE="12" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0">errytrtyr</FONT>
</LI>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<P ALIGN="LEFT">
sdgfdsgsds
</P>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<LI>
<FONT FACE="System" SIZE="16" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0">nm,hjku
<FONT FACE="Lato" SIZE="12"></FONT>
</FONT>
</LI>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<LI>
<FONT FACE="System" SIZE="16" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0">
<B>hgjgj</B>
<FONT FACE="Lato" SIZE="12"></FONT>
</FONT>
</LI>
</TEXTFORMAT>
<TEXTFORMAT LEADING="2">
<P ALIGN="CENTER">
<FONT FACE="Lato" SIZE="12" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0">centered text</FONT>
</P>
</TEXTFORMAT>
</root>
预期输出
<div>
<div style="text-align:LEFT; ">
edfg
</div>
<div style="text-align:LEFT; ">
sdgfdsgsds
</div>
<ul>
<li>
sdfgdsg
</li>
<li>
dsgdfgdsfg
</li>
<li>
<FONT COLOR="#4B4B4B" FACE="Lato" SIZE="12">errytrtyr</FONT>
</li>
</ul>
<div style="text-align:LEFT; ">
sdgfdsgsds
</div>
<ul>
<li>
<FONT COLOR="#4B4B4B" FACE="System" SIZE="16">nm,hjku
<FONT FACE="Lato" SIZE="12"></FONT>
</FONT>
</li>
<li>
<FONT COLOR="#4B4B4B" FACE="System" SIZE="16">
<B>hgjgj</B>
<FONT FACE="Lato" SIZE="12"></FONT>
</FONT>
</li>
</ul>
<div style="text-align:CENTER; ">
<FONT COLOR="#4B4B4B" FACE="Lato" SIZE="12">centered text</FONT>
</div>
</div>
我的代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes" method="html"/>
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<div>
<xsl:apply-templates/>
</div>
</xsl:template>
<!-- remove unwanted attributes -->
<xsl:template match="@LETTERSPACING|@KERNING"/>
<!-- Remove <P> tag and set the alignment -->
<xsl:template match="P">
<div>
<xsl:attribute name="style">
<!-- collect attributes -->
<xsl:variable name="styles">
<xsl:if test="@ALIGN">
<xsl:value-of select="concat('text-align:', @ALIGN )"/>
<xsl:text>; </xsl:text>
</xsl:if>
</xsl:variable>
<!-- delete trailing spaces -->
<xsl:value-of select="$styles"/>
</xsl:attribute>
<xsl:apply-templates/>
</div>
</xsl:template>
<!-- Replace <LI> with <li> -->
<xsl:template match="LI">
<li><xsl:apply-templates/></li>
</xsl:template>
<!-- Remove TEXTFORMAT -->
<xsl:template match="TEXTFORMAT">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
非常好的问题,顺便说一句。简洁、完整、语法有效的示例代码和输入,预期输出与给定输入匹配。在所有相关领域都到位。 @Tomalak 你能看看this 谢谢你的出色回答 【参考方案1】:这种类型的分组在 XSLT 1.0 中有些困难。
如果可以假设每个 LI 组前面都有一个 P,并且在 root
元素中没有其他类型的节点,那么您可以这样做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="LI" match="TEXTFORMAT[LI]" use="generate-id(preceding-sibling::TEXTFORMAT[P][1])" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<div>
<xsl:apply-templates select="TEXTFORMAT[P]"/>
</div>
</xsl:template>
<xsl:template match="TEXTFORMAT">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="P">
<div style="text-align:@ALIGN;">
<xsl:apply-templates/>
</div>
<xsl:variable name="li" select="key('LI', generate-id(..))" />
<xsl:if test="$li">
<ul>
<xsl:apply-templates select="$li"/>
</ul>
</xsl:if>
</xsl:template>
<xsl:template match="LI">
<li>
<xsl:apply-templates/>
</li>
</xsl:template>
<xsl:template match="@LETTERSPACING|@KERNING"/>
</xsl:stylesheet>
【讨论】:
【参考方案2】:以下 XSLT 1.0 转换为您提供了看似想要的结果:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes" method="html"/>
<xsl:key name="list" match="TEXTFORMAT[LI]" use="generate-id(
(self::*|preceding-sibling::*)[LI][
not(preceding-sibling::*[1][LI])
][last()]
)" />
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<div>
<xsl:apply-templates />
</div>
</xsl:template>
<!-- Remove <P> tag and set the alignment -->
<xsl:template match="P">
<div>
<xsl:attribute name="style">
<xsl:apply-templates select="@*" mode="css" />
</xsl:attribute>
<xsl:apply-templates/>
</div>
</xsl:template>
<xsl:template match="@ALIGN" mode="css">
<xsl:value-of select="concat('text-align:', ., ';')"/>
</xsl:template>
<!-- add more -->
<xsl:template match="@*" mode="css" />
<!-- remove unwanted attributes -->
<xsl:template match="@LETTERSPACING|@KERNING"/>
<xsl:template match="TEXTFORMAT[LI]">
<xsl:variable name="adjacent" select="key('list', generate-id())" />
<xsl:if test="$adjacent">
<ul>
<xsl:apply-templates select="$adjacent/LI" />
</ul>
</xsl:if>
</xsl:template>
<!-- Replace <LI> with <li> -->
<xsl:template match="LI">
<li><xsl:apply-templates/></li>
</xsl:template>
<!-- Remove TEXTFORMAT -->
<xsl:template match="TEXTFORMAT">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
结果:
<div>
<div style="text-align:LEFT;">
edfg
</div>
<div style="text-align:LEFT;">
sdgfdsgsds
</div>
<ul>
<li>
sdfgdsg
</li>
<li>
dsgdfgdsfg
</li>
<li><FONT FACE="Lato" SIZE="12" COLOR="#4B4B4B">errytrtyr</FONT></li>
</ul>
<div style="text-align:LEFT;">
sdgfdsgsds
</div>
<ul>
<li><FONT FACE="System" SIZE="16" COLOR="#4B4B4B">nm,hjku
<FONT FACE="Lato" SIZE="12"></FONT></FONT></li>
<li><FONT FACE="System" SIZE="16" COLOR="#4B4B4B"><B>hgjgj</B><FONT FACE="Lato" SIZE="12"></FONT></FONT></li>
</ul>
<div style="text-align:CENTER;"><FONT FACE="Lato" SIZE="12" COLOR="#4B4B4B">centered text</FONT></div>
</div>
解决方案的关键,顾名思义,就是这个结构:
<xsl:key name="list" match="TEXTFORMAT[LI]" use="generate-id(
(self::*|preceding-sibling::*)[LI][
not(preceding-sibling::*[1][LI])
][last()]
)" />
这会根据开始当前系列的最近的TEXTFORMAT[LI]
的唯一 ID 对文档中的每个 TEXTFORMAT[LI]
进行索引,即之前没有 TEXTFORMAT[LI]
的最近的 ID。
从那里开始,我们可以在<xsl:template match="TEXTFORMAT[LI]">
中决定是否为任何给定的TEXTFORMAT[LI]
输出一些东西。
【讨论】:
以上是关于C# 向xml添加节点 或者说添加一个不同数据结构的表的主要内容,如果未能解决你的问题,请参考以下文章
使用xslt和c#从中选择一个xml节点并根据其值添加更多节点[重复]