0

以下是我的 xml 当前外观的示例:

<Records>
  <Record>
    <Field id='NAMEOFBUSINESS'>
        <Value>J's Burgers</Value>
    </Field>
    <Field id='BUSINESSPHONE'>
        <Value>777-888-9999</Value>
    </Field>
  <Record>
</Records>

但是,我需要它看起来像这样:

<Records>
  <Record>
    <Field id='NAMEOFBUSINESS'>
        <Value>J&apos;s Burgers</Value>
    </Field>
    <Field id='BUSINESSPHONE'>
        <Value>777-888-9999</Value>
    </Field>
  <Record>
</Records>

目前我的代码如下所示:

using (var sr = new StreamReader(filePath, encode))
        {
            xmlDocument.Load(sr);
        }
        XmlNodeList nlist = null;

        XmlNode root = xmlDocument.DocumentElement;
        if (root != null)
        {
            nlist = root.SelectNodes("//Field");
        }

        if (nlist == null)
        {
            return;
        }
        foreach (XmlElement node in nlist)
        {
            if (node == null)
            {
                continue;
            }
            var value = node.Value;
            if (value != null)
            {
                var newValue = value.Replace("'", "&apos;");
                node.Value = newValue;
            }
        }
        using (var xmlWriter = new XmlTextWriter(filePath, encode))
        {
            xmlWriter.QuoteChar = '\'';
            xmlDocument.Save(xmlWriter);
        }            

所以我需要转义“'”,但只能在撇号所在的值元素内。

4

1 回答 1

1

首先,您拥有的 XML 无效,可能是拼写错误:在第 9 行,它应该读取</Record>而不是<Record>. 如果这不是固定的,XML 解析器将抛出异常。

除此之外,XML 很好。撇号只需要在属性值中转义,而不是在元素值中。因此,如果其他应用程序不需要它,实际上没有理由替换它。

现在,您正在对<Field>元素进行替换,它打算在<Value>元素上进行替换。所以改变

nlist = root.SelectNodes("//Field");
...
var value = node.Value;

nlist = root.SelectNodes("//Field/Value");
...
var value = node.InnerText;

这将生成以下 XML:

... <Value>J&amp;apos;s Burger</Value> ...

但这是完全合法的。任何符合 XML 的应用程序都会读回它,&apos;如下面的代码所示:

var xml = new XmlDocument();
xml.LoadXml("...XML here...");
XmlNodeList nodes = xml.SelectNodes("//Field/Value");
foreach (XmlElement node in nodes)
{
    node.InnerText = node.InnerText.Replace("'", "&apos;");
}
// Result
Console.WriteLine(xml.OuterXml);

// This is what other applications will get
Console.WriteLine(xml.SelectSingleNode("//Field/Value/text()").Value);
Console.ReadLine();
于 2015-07-14T14:18:41.020 回答