这个文件或代码有什么问题?

时间:2016-02-28 00:38:50

标签: c# xml xmldocument xelement selectsinglenode

发生了什么\有什么区别? 我试图从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 parent返回null。我已经调试了,root和xmlDoc在其内部文本上有XML内容。 但是,在这里做了一个测试(由用户@ har07在前一个问题上做出: SelectSingleNode returns null even with namespace managing 工作没有问题。 https://dotnetfiddle.net/vJ8h9S

这两者有什么区别?它们基本上遵循相同的代码,但是一个有效,另一个没有 调试时我发现root.InnerXml自己加载了内容(与XmlDoc.InnerXml相同)。但是InnerXml并没有为SelectSingleNode实现一个方法。我相信,如果我将它保存为字符串,我可能会丢失缩进等等。

有人可以告诉我有什么区别或有什么不对吗?谢谢 ! XML示例:https://drive.google.com/file/d/0BwU9_GrFRYrTUFhMYWk5blhhZWM/view?usp=sharing

1 个答案:

答案 0 :(得分:1)

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,因为它无效,当您加载它时会导致异常。