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 に答える