0

シリアル化された xml と、xml を解析してテーブルに値を挿入するストアド プロシージャを生成するサード パーティ コンポーネントがあります。

コンポーネントと sql ストアド プロシージャで処理される xsi nil に問題があります。コンポーネントまたはストアド プロシージャを変更する権限がありません。したがって、プロシージャ ソリューションの xsi=true ではなく、プロパティ ソリューションの IsNullable 属性は役に立ちません。

正規表現を使用してこれを処理しようとしています。

.*xsi\:nil\=\"true\" \/\>

上記の正規表現の一致は、以下の入力に最適です

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<prop1>
    <prop11>abc</prop11>
    <prop12 xsi:nil="true" />
    <prop13>def</prop13>
</prop1>
</Root>

しかし、この入力ではありません

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><prop1><prop11>abc</prop11><prop12 xsi:nil="true" /><prop13>def</prop13></prop1></Root>

望ましい出力は

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<prop1>
    <prop11>abc</prop11>
    <prop13>def</prop13>
</prop1>
</Root>

更新: プロパティ名とレベルは実行時にのみわかります。以下の別の xml を参照してください

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<pa>
    <paa>abc</paa>
    <pab xsi:nil="true" />
    <pac>def</pac>
            <pad>
               <pada>val1</pada>
               <padb xsi:nil="true" />
               <padc>
                     <padca>vala</padca>
                     <padcb xsi:nil="true" />
               </padc>
            <pad>
</prop1>
</Root>

上記の xml の望ましい出力は次のとおりです。

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<pa>
    <paa>abc</paa>
    <pac>def</pac>
            <pad>
               <pada>val1</pada>
               <padc>
                     <padca>vala</padca>
               </padc>
            <pad>
</prop1>
</Root>

誰か助けてくれませんか

ありがとう、

エセン

4

2 に答える 2

4

このライブラリの XPath を使用: https://github.com/ChuckSavage/XmlLib/

次の XElements を取得xsi:nil=trueします。

XElement root = XElement.Load(file);
// or root = XElement.Parse(xml);
IEnumerable<XElement> result = root.XPath("//*[@xsi:nil={0}]", true);
result.ToList().ForEach(x => x.Remove());
root.Save(file);
// or xml = root.ToString();

私はこのXMLでそれをテストしました:

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <prop1>
    <prop10 xsi:nil="true" />
    <prop11>abc</prop11>
    <prop12 xsi:nil="true" />
    <prop13>def</prop13>
    <prop14 xsi:nil="true" />
    <prop15>def</prop15>
    <prop16 xsi:nil="true" />
  </prop1>
</Root>

4 つの XElements がすべて見つかりました。そこからそれらは削除されます。

結果の XML は次のとおりです。

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <prop1>
    <prop11>abc</prop11>
    <prop13>def</prop13>
    <prop15>def</prop15>
  </prop1>
</Root>

が true であることを気にせずxsi:nil、属性を持つすべてのノードを削除したいだけの場合はxsi:nil、次のように XPath を組み立てることができます。

IEnumerable<XElement> result = root.XPath("//*[@xsi:nil]");
于 2012-05-29T16:59:23.307 に答える
0

Linqを使用してXMLを作成する

using System.Xml.Linq;

        var f = XDocument.Load("c:\\01.xml");
        var xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
        var nills = from n in f.Root.Elements("prop1").Elements()
                    where n.Attribute(xsi + "nil") != null
                    select n;

        nills.ToList().ForEach(x => x.RemoveAttributes());

        f.Save("c:\\011.xml");

これにより、次の結果が得られました。

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <prop1>
    <prop11>abc</prop11>
    <prop12 />
    <prop13>def</prop13>
  </prop1>
</Root>
于 2012-05-29T17:06:11.327 に答える