此文件或代码有什么问题
本文关键字:什么 问题 代码 文件 | 更新日期: 2023-09-27 18:36:37
发生了什么
''有什么区别?我正在尝试从 XML 文件返回特定节点。
XML文件:
<?xml version="1.0" encoding="utf-8"?>
<JMF SenderID="InkZone-Controller" Version="1.2">
<Command ID="cmd.00695" Type="Resource">
<ResourceCMDParams ResourceName="InkZoneProfile" JobID="K_41">
<InkZoneProfile ID="r0013" Class="Parameter" Locked="false" Status="Available" PartIDKeys="SignatureName SheetName Side Separation" DescriptiveName="Schieberwerte von DI" ZoneWidth="32">
<InkZoneProfile SignatureName="SIG1">
<InkZoneProfile Locked="False" SheetName="S1">
<InkZoneProfile Side="Front" />
</InkZoneProfile>
</InkZoneProfile>
</InkZoneProfile>
</ResourceCMDParams>
</Command>
<InkZoneProfile Separation="Cyan" ZoneSettingsX="0 0,005 " />
</JMF>
法典:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("C:''test''test.xml");
XmlNode root = xmlDoc.DocumentElement;
var parent = root.SelectSingleNode("/JMF/Command/ResourceCmdParams/InkZoneProfile/InkZoneProfile/InkZoneProfile/InkZoneProfile");
XmlElement IZP = xmlDoc.CreateElement("InkZoneProfile");
IZP.SetAttribute("Separation", x.colorname);
IZP.SetAttribute("ZoneSettingsX", x.colorvalues);
xmlDoc.DocumentElement.AppendChild(IZP);
xmlDoc.Save("C:''test''test.xml");
var 父级返回我 null。我已经调试了,根和 xmlDoc 的内部文本上有 XML 内容。但是,这里所做的测试(由用户@har07进行,关于上一个问题:选择单节点返回空,即使使用命名空间管理工作没有问题。https://dotnetfiddle.net/vJ8h9S
这两者有什么区别?它们基本上遵循相同的代码,但一个有效,另一个无效。
调试时,我找到了那个根。InnerXml 本身加载了内容(与 XmlDoc.InnerXml 相同)。但是InnerXml没有实现SelectSingleNode的方法。我相信如果我将其保存到字符串中,我可能会丢失缩进等。
有人可以告诉我有什么区别或有什么问题吗?谢谢!XML 示例:https://drive.google.com/file/d/0BwU9_GrFRYrTUFhMYWk5blhhZWM/view?usp=sharing
SetAttribute
不会为您自动转义字符串。因此,它使您的XML文件无效。
来自 MSDN 关于 XmlElement.SetAttribute
任何标记(例如要识别为实体引用的语法)都被视为文本,并且在写出时需要由实现正确转义
在代码中查找所有行都包含SetAttribute
并使用SecurityElement.Escape
转义值。
例如:更改这些行:
IZP.SetAttribute("Separation", x.colorname);
IZP.SetAttribute("ZoneSettingsX", x.colorvalues);
自:
using System.Security;
IZP.SetAttribute("Separation", SecurityElement.Escape(x.colorname));
IZP.SetAttribute("ZoneSettingsX", SecurityElement.Escape(x.colorvalues));
如果属性的名称包含任何<>"'&
则还必须像值一样对其进行转义。
注意:
您必须删除使用旧代码创建的当前xmls,因为它无效,加载时会导致异常。