【问题标题】:What is wrong with this file or code?这个文件或代码有什么问题?
【发布时间】:2016-06-11 04:17:38
【问题描述】:

发生了什么\有什么区别? 我正在尝试从 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。我已经调试过,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

【问题讨论】:

  • 可能是因为您的 XML 中有 &amp; 字符。 &amp; 是 XML 中的 special character,需要转义。在我链接的演示中,我删除了所有&amp; 字符以使其正常工作,否则LoadXml() 将抛出异常
  • @Pablo 这是您创建此行的代码中的错误:&lt;InkZoneProfile Separation=... 在此处发布,我会告诉您如何解决。
  • @Sakura 检查编辑
  • 抱歉,看起来很糟糕。我在打电话

标签: c# xml xmldocument xelement selectsinglenode


【解决方案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));

如果属性的名称包含&lt;&gt;"'&amp; 中的任何一个,您还必须像值一样对其进行转义。

注意:

你必须删除你使用旧代码创建的当前xml,因为它是无效的,当你加载它时会导致异常。

【讨论】:

  • @PabloCosta 当然,所有属性的值都有双引号。这是标准。属性的语法是name="value"
  • 没有双引号 + 有&amp;amp; 字符是什么意思?你的意思是你想要一个像这样的xml注释&lt;node att=this &amp; that&gt;
  • 能否发布您提到的 XML 示例?
  • 好的,我明白了。您不必担心单引号或双引号。它是价值的边界。我说的是那个边界内的字符。按照我上面的建议,您将拥有有效的 XML 文件。此外,如果一个属性包含以下任何字符串,它仍然可以:&amp;lt;&amp;gt;&amp;quot;&amp;apos;&amp;amp;
  • 好的。在这里发布C:\\test\\test.xml 文件(真正的当前xml)我会指出你做错了什么。
猜你喜欢
  • 2018-02-28
  • 1970-01-01
  • 2012-08-07
  • 2014-08-29
  • 2013-06-05
  • 2014-06-04
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多