0

次のような XML ファイルがあります。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="https://www.someurl.com/somefile.xslt"?>
<AutoInsuranceClaim xmlns="http://www.someurl.com/schemas/AutoInsuranceClaim">
    <Identification>
        <BaseOwner>3</BaseOwner>
        <BaseType>ABC123</BaseType>
        <BaseTypeRef>471038341757</BaseTypeRef>
    </Identification>
</AutoInsuranceClaim>

識別ノードを読み取ろうとしています。これが私のコードです:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"..\..\Data.xml");

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace("ns", "http://www.someurl.com/schemas/AutoInsuranceClaim");

XmlNodeList nodeList = xmlDoc.SelectNodes(@"/ns:AutoInsuranceClaim/Identification", nsmgr);

Console.WriteLine("There are {0} nodes...", nodeList.Count);

少なくとも 1 つの値を取得する必要があることはわかっています。.NET XML 解析に関する私の理解では、プレフィックスのない既定の名前空間がある場合は、独自の名前空間を作成する必要があります。しかし、これは 1 を返すはずでした。

そうでない場合、何が欠けていますか?

4

3 に答える 3

2
        XElement root = XElement.Load("Data.xml");
        var identifications = root.Descendants()
           .Where(x => x.Name.LocalName == "Identification")
           .ToList()
于 2012-08-15T19:33:30.007 に答える
2

ここでストローをつかんでいるかもしれませんが、xpath 式で両方のエンティティの名前空間を指定するべきではありませんか?

XmlNodeList nodeList = xmlDoc.SelectNodes(@"/ns:AutoInsuranceClaim/ns:Identification", nsmgr);
于 2012-08-15T19:29:06.510 に答える
1

問題は、名前空間のないIdentificationノードを見つけようとしているということですが、その部分のために親と同じ名前空間にデフォルト設定されています。これを試して:xmlns=...

var nodeList = xmlDoc.SelectNodes("/ns:AutoInsuranceClaim/ns:Identification", 
                                  nsmgr);

自分で試してみたところ、カウントは 1 でした。

個人的には、代わりに LINQ to XML を使用します。これにより、名前空間の処理が容易になります。

XDocument doc = XDocument.Load(@"..\..\Data.xml");
XNamespace ns = "http://www.someurl.com/schemas/AutoInsuranceClaim";
var nodes = doc.Root.Elements(ns + "Identification");
于 2012-08-15T19:28:37.157 に答える