在C#中,如何使用XmlDocument将xml中的节点替换为另一个节点.
对于Eg,请考虑以下xml文件.
<Products>
<Product ProdID="1">
<Data>abc</Data>
</Product>
<Product ProdID="2">
<Data>def</Data>
</Product>
</Products>
Run Code Online (Sandbox Code Playgroud)
我们说我需要更换
<Product ProdID="2">
<Data>def</Data>
</Product>
Run Code Online (Sandbox Code Playgroud)
使用新节点
<Product ProdID="2">
<Data>xyz</Data>
</Product>
Run Code Online (Sandbox Code Playgroud) 我正在制作一个程序,将其数据存储在XML文件中.当人们编写XML时,他们可以犯下微妙的错误,例如结束注释,-看起来像是<!-- comment --->在</>内部添加属性.当然,XML仍然可以正确读取,但是尝试将此文本输入到XmlDocument中会产生语法错误(并且不会被解析).
有没有办法使XmlDocument不那么严格,并使它忽略不会使文档无法解析的违反标准?例如,它显然<!-- comment --->仍然是一个注释,即使它-最终包含的是违反标准规范的).
使用xmlDocument.Load()方法加载xml文件时出现以下错误:

我收到此错误,因为我的XML中有一些无效字符"ETB".我怎样才能解决这个问题?该字符是二进制编码图像数据的一部分.
<prompt>
<![CDATA[<FlowDocument xmlns="http://schemas.microsoft.com/something"><Paragraph xmlns="http://schemas.microsoft.com/something"><InlineUIContainer BaselineAlignment="Center">
<Image Stretch="None" Width="1024" Height="282"><Image.Source><BitmapImage><base64Binary>(Base 64 encoded data containing 'ETB' Text)
</base64Binary></BitmapImage></Image.Source></Image></InlineUIContainer></Paragraph></FlowDocument>]]>
</prompt>
Run Code Online (Sandbox Code Playgroud)
Base 64 Binary数据是这样的:
iVBORw0KGgoAAAANSUhEUgAABAAAAAEaCAIAAAAACrKOAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOvwAADr8BOAVTJAAAaz9JREFUeF7tnQVgE03Tx8ODu7u7u7v7i7trcS0Ul + Luxd2Ke7FSrEix4oWixZ3iFErlnd1NLqlQ0sbukv + 938eTnOzO/HavmdmdnY0WHByswgECIAACIAACIAACIAACIGAjBMgBwAECIAACIAACIAACIAACIGAjBFQ2oifUBAEQAAEQAAEQAAEQAAEQYOE/oAACIAACIAACIAACIAACIGA7BOAA2E5bQ1MQAAEQAAEQAAEQAAEQwAwA + gAIgAAIgAAIgAAIgAAI2BIBzADYUmtDVxAAARAAARAAARAAAZsnAAfA5rsAAIAACIAACIAACIAACNgSAeU5AEFRaZ4oPfSPikKVaYoqoqIqnpEBAXQGyzZCYJjqw56xrIS ...
这些数据之间有"ETB"
我正在尝试通过使用以下代码中的C#XmlDocument类来编写一个SOAP请求来ebay FindingAPI Web服务:
XmlDocument doc = new XmlDocument();
XmlElement root = (XmlElement)doc.AppendChild(doc.CreateElement("soap", "Envelope", "http://www.w3.org/2003/05/soap-envelope"));
root.SetAttribute("xmlns", "http://www.ebay.com/marketplace/search/v1/services");
XmlElement header = (XmlElement)root.AppendChild(doc.CreateElement("soap", "Header", "http://www.w3.org/2003/05/soap-envelope"));
XmlElement body = (XmlElement)root.AppendChild(doc.CreateElement("soap", "Body", "http://www.w3.org/2003/05/soap-envelope"));
XmlElement request = (XmlElement)body.AppendChild(doc.CreateElement("findItemsByKeywordsRequest"));
XmlElement param = (XmlElement)request.AppendChild(doc.CreateElement("keywords"));
param.InnerText = "harry potter phoenix";
Run Code Online (Sandbox Code Playgroud)
并且,上面代码的XML输出是:
<soap:Envelope xmlns="http://www.ebay.com/marketplace/search/v1/services" xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header />
<soap:Body>
<findItemsByKeywordsRequest xmlns="">
<keywords>harry potter phoenix</keywords>
</findItemsByKeywordsRequest>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
但是,由于findItemsByKeywordsRequest元素中的额外xmlns =""属性,服务器无法识别此XML.所需的XML输出应如下所示:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns="http://www.ebay.com/marketplace/search/v1/services">
<soap:Header/>
<soap:Body>
<findItemsByKeywordsRequest>
<keywords>harry potter phoenix</keywords>
</findItemsByKeywordsRequest>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
有谁知道我的代码有什么问题,请给我一些提示.谢谢!
由于某些原因,我将不去讨论,因此无法将对象类型用作webapi控制器的参数。因此,我需要找到一种使用XmlDocument或类似方法将xml对象反序列化为c#对象的方法。
这是我到目前为止的内容:
public void Post(HttpRequestMessage request)
{
var xmlDoc = new XmlDocument();
xmlDoc.Load(request.Content.ReadAsStreamAsync().Result);
using (XmlReader xmlReader = new XmlNodeReader(xmlDoc))
{
Object obj = new XmlSerializer(typeof(myObject)).Deserialize(xmlReader);
myObject scp = (myObject)obj;
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这引发了错误。谁能提供一些关于如何将xml反序列化到对象中的建议?
tia
编辑:这是我要反序列化的xml:
<Student>
<studentid>1234</studentid>
<command>post</command>
<posttype>charge</posttype>
<transaction_description>This is a test post to the web api</transaction_description>
<payment_type>CC</payment_type>
<term_code>2013SPRING</term_code>
<amount>432.75</amount>
</Student>
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
System.InvalidOperationException:意外。产生日期:2014年3月19日,星期三,格林尼治标准时间
System.InvalidOperationException:XML文档(1、2)中存在错误。---> System.InvalidOperationException:意外。-在Microsoft.Xml.Serialization.GeneratedAssembly 。 .API.StudentInformationPostController.Post(HttpRequestMessage请求)位于System.Web上lambda_method(Closure,Object,Object [])的C:\ Projects \ CashNetSSO \ Development \ CashNetSSO \ CashNetSSO \ Controllers \ API \ StudentInformationPostController.cs:第23行。 Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor。<> c_ DisplayClassf.b
。 .Serialization.XmlSerializer.Deserialize(Stream stream)
_9(Object实例,对象[] …
我需要使用Powershell从更大的XML文档中提取节点(和子节点),并创建一个新的独立XML文档,其中只包含提取的XML节点(和子节点); 然后我需要将这个新提取的XML保存在一个文件中.提取的顶级XML节点具有属性.看来我必须设置新的XML对象的XMLDocument值来执行此操作,但XMLDocument是一个只读属性.有人可以帮忙吗?
我在Stackoverflow上尝试了所有可能的答案,但无法解决。
我将以下xml作为字符串:
private static final String xmlStr = "<parameters>\n" +
" <parameter>\n" +
" <name>emp</name>\n" +
" <keyvalue>John Smith</keyvalue>\n" +
" </parameter>\n" +
" <parameter>\n" +
" <name>age</name>\n" +
" <keyvalue>22</keyvalue>\n" +
" </parameter>\n" +
" <parameter>\n" +
" <name>Birth Date</name>\n" +
" <keyvalue>02/05/1978</keyvalue>\n" +
" </parameter>\n" +
" <parameter>\n" +
" <name>password</name>\n" +
" <keyvalue>ye63633</keyvalue>\n" +
" </parameter>\n" +
"</parameters>";
Run Code Online (Sandbox Code Playgroud)
该参数可以用任何字符串替换(我尝试不成功),并且以下代码返回空文档:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(xmlStr.getBytes("UTF-8")));
Run Code Online (Sandbox Code Playgroud)
我尝试用以下方式替换文档:
Document …Run Code Online (Sandbox Code Playgroud) 我在 C# 上读取 XML 文件时遇到了一些问题。这是我的 XML 文件:
<?xml version = "1.0" encoding="ISO8859-1" standalone="yes" ?>
<SITES>
<SITE>
<ERROR_COUNTER>0</ERROR_COUNTER>
<PROD>0</PROD>
<LOGINFO>
<URL>http://site1.com/login</URL>
<LOGIN>login</LOGIN>
<PASSWORD>pass</PASSWORD>
<DELAYMAX>20</DELAYMAX>
</LOGINFO>
<EMAIL>
<TO>dsds@dee.com, dsdsddd@dee.com,dsdds@dee.com</TO>
<SUBJECT></SUBJECT>
<BODY></BODY>
<PATH></PATH>
</EMAIL>
<TESTS>
<TEST>
<URL>http://site1.com/settings</URL>
<DELAYMAX>5</DELAYMAX>
</TEST>
<TEST>
<URL>http://site1.com/faq</URL>
<DELAYMAX>5</DELAYMAX>
</TEST>
<TEST>
<URL>http://site1.com/download-faq-pdf</URL>
<DELAYMAX>5</DELAYMAX>
</TEST>
</TESTS>
</SITE>
<SITE>
<ERROR_COUNTER>0</ERROR_COUNTER>
<PROD>0</PROD>
<LOGINFO>
<URL>http://site2.com/login</URL>
<LOGIN>login2</LOGIN>
<PASSWORD>pass2</PASSWORD>
<DELAYMAX>20</DELAYMAX>
</LOGINFO>
<EMAIL>
<TO>dsds@dee.com, dsdsddd@dee.com,dsdds@dee.com</TO>
<SUBJECT></SUBJECT>
<BODY></BODY>
<PATH></PATH>
</EMAIL>
<TESTS>
<TEST>
<URL>http://site2.com/settings</URL>
<DELAYMAX>5</DELAYMAX>
</TEST>
<TEST>
<URL>http://site2.com/faq</URL>
<DELAYMAX>5</DELAYMAX>
</TEST>
<TEST>
<URL>http://site2.com/download-faq-pdf</URL>
<DELAYMAX>5</DELAYMAX>
</TEST>
</TESTS>
</SITE>
</SITES>
Run Code Online (Sandbox Code Playgroud)
所以我希望能够在 C# …
如何删除XML文档中元素c的结束标记?
转换后的XML将通过模式验证,因为它内部有空格而被拒绝.我正在使用C#,.NET 1.1(我正在更新遗留应用程序:-().
注意:我不得求助于字符串操作来转换XML文档.
当前:
<main>
<a>
<b />
<c>
</c>
</a>
</main>
Run Code Online (Sandbox Code Playgroud)
最后:
<main>
<a>
<b />
<c />
</a>
</main>
Run Code Online (Sandbox Code Playgroud)
更新1:有关其他详细信息,最终的XML文档将另存为文件,然后另一个进程验证该文件.看来保存的XML已格式化.
我不确定这是否属实:
<a></a> == <a />
Run Code Online (Sandbox Code Playgroud) 我需要操作XML字符串.
字符串是这个:
<div class="addthis_toolbox addthis_default_style ">
<a class="addthis_button_facebook_like" fb:like:layout="button_count"></a>
<a class="addthis_button_tweet"></a>
<a class="addthis_counter addthis_pill_style"></a>
</div>
Run Code Online (Sandbox Code Playgroud)
我以为我会将其转换为XmlDocument,但XmlDocument.LoadXml()会抛出有关":"字符的错误; 这是因为fb:like:layout属性.
我需要做的是addthis:url使用a addthis_toolbox或addthis_buttonclass 为第一个元素添加一个属性.
我非常有信心能找到具有正确类的元素,但我不能确信我可以添加这样的"复合"属性...特别是因为我甚至无法将该东西加载到XmlDocument .
我错过了什么 ?有更好/更简单的方法吗?
谢谢
xmldocument ×10
c# ×8
xml ×8
.net ×1
.net-1.1 ×1
java ×1
parsing ×1
powershell ×1
prefix ×1
xml-parsing ×1
xmlreader ×1