ดึงข้อมูลจากไฟล์ XML และแก้ไข


2

สมมติตัวอย่างต่อไปนี้:

ฉันมีไฟล์ XML ชื่อ plants.xml

<?xml version="1.0" encoding="utf-8"?>
<Plant>
<Zone Left="{PRKNG-7}">
<Data key="Bloodroot">Sanguinaria_canadensis</Data>
<Data key="Columbine">Aquilegia_canadensis</Data>
<Data key="Hepatica">Hepatica_americana</Data>
<Data key="Mayapple">Podophyllum_peltatum</Data>
</Zone>
<Direction Right="{PRKNG-8}">
<Data key="Zone">4</Data>
<Data key="Light">Shade</Data>
<Data key="Depth">Surface</Data>
<Data key="Availability">23262156</Data>
</Direction>
</Plant>

ด้วย PowerShell ฉันต้องการเรียกหมายเลข "23262156" ด้านหลัง "Availibility" เพิ่ม 1 และบันทึก XML อีกครั้ง

ฉันไม่ต้องการแทนที่หมายเลข (เนื่องจากมันแตกต่างกันในแต่ละครั้ง) เพียงเพิ่ม 1 เพื่อให้เป็น 23262157

ครั้งต่อไปจำนวนอาจเป็น 234159 และฉันต้องการเพิ่ม 1 อีกครั้งดังนั้นมันจะเป็น 234160

เพื่อความชัดเจน: ฉันไม่ต้องการใช้คำสั่ง "replace" รับเนื้อหา c: \ 1.txt | ForEach-Object {$ _ -replace "23262156", "23262157"} | ชุดเนื้อหา c: \ 1.txt ฉันต้องการใช้บางอย่างเช่น "23262156" +1 ดังนั้นผลลัพธ์คือ 23262157 เพราะครั้งต่อไปที่ฉันเรียกใช้สคริปต์อาจมีหมายเลขอื่น ถ้าฉันรันคำสั่ง "replace" ผลลัพธ์จะเป็น 23262157 อีกครั้งแทนที่จะเป็น +1


ความพร้อมใช้งานอยู่เสมอที่บรรทัดเดียวกันหรือไม่
Sonamor

(1) ฉันไม่เข้าใจสิ่งที่คุณหมายถึงโดย "ฉันไม่ต้องการแทนที่หมายเลข" คุณต้องการเขียน“ 03262157” ลงในไฟล์ใช่ไหม คุณต้องการเพิ่มรายการที่ระบุ<Data key="Availibility">03262157</Data> นอกเหนือจากรายการที่ระบุว่า <Data key="Availibility">03262156</Data> ? ไม่มี? คุณต้องการแทนที่อันที่พูด<Data key="Availibility">03262156</Data>ด้วยอันที่พูด<Data key="Availibility">03262157</Data>? กรุณาอธิบาย. (2) ข้อมูลของคุณสะกดผิดว่า“ ว่าง” หรือไม่? (3) คุณจำเป็นต้องรักษาศูนย์นำหน้าหรือไม่? … (ต่อ)
สกอตต์

(ต่อ) ... (4) โดยทั่วไปจะแนะนำให้คุณใช้ตัวแยกวิเคราะห์ XML เพื่อแยกวิเคราะห์ XML และไม่พยายามที่จะเข้าใกล้มันด้วยเครื่องมือประมวลผลข้อความทั่วไป ……………………………………………ทุก…กรุณาอย่าตอบในความคิดเห็น; แก้ไขคำถามของคุณเพื่อให้ชัดเจนและสมบูรณ์ยิ่งขึ้น
สกอตต์

(1) ฉันอธิบายได้ดีขึ้นเล็กน้อย ไม่มีคำสั่งแทนที่ แต่ทำผลรวมของหมายเลข +1 (2) ประเภทควรเป็น "ห้องว่าง" ขออภัย :) (3) ฉันทราบว่าจำนวนสามารถเปลี่ยนแปลงได้ แต่มันก็เป็นตัวอย่างที่ไม่ดี จะไม่มีวันเป็นศูนย์นำ (4) ฉันรู้ แต่ฉันไม่สามารถเข้าใจได้ นั่นเป็นเหตุผลที่ฉันต้องการความช่วยเหลือจากคุณ
James

ไม่ความพร้อมใช้งานไม่ได้อยู่ในบรรทัดเดียวกันเสมอไป
James

คำตอบ:


1

ใช้ XSLT:

#transform to HTML report
$xslt=New-Object System.Xml.Xsl.XslCompiledTransform
$xslt.Load("$pwd\transform.xsl")
$xslt.Transform("$pwd\original.xml","$pwd\result.xml") 

ด้วยสไตล์ชีทต่อไปนี้:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"
            >
<xsl:template match="node()" mode="print">

        <xsl:choose>

            <!-- is it element? -->
            <xsl:when test="name()">
                <br />

                <!-- start tag -->
                <xsl:text>&lt;</xsl:text>
                <xsl:value-of select="name()" />

                <!-- attributes -->
                <xsl:apply-templates select="@*" mode="print" />

                <xsl:choose>

                    <!-- has children -->
                    <xsl:when test="node()">
                        <!-- closing bracket -->
                        <xsl:text>&gt;</xsl:text>

                        <!-- children -->
                        <xsl:apply-templates mode="print" />

                        <!-- end tag -->
                        <xsl:text>&lt;/</xsl:text>
                        <xsl:value-of select="name()" />
                        <xsl:text>&gt;</xsl:text>
                        <br />
                    </xsl:when>

                    <!-- is empty -->
                    <xsl:otherwise>

                        <!-- closing bracket -->
                      <xsl:text>/&gt;</xsl:text><br />

                      <br />
                    </xsl:otherwise>

                </xsl:choose>

            </xsl:when>

            <!-- text -->
            <xsl:otherwise>
                <xsl:copy />
            </xsl:otherwise>

        </xsl:choose>

</xsl:template>

<xsl:template match="@*" mode="print">
    <xsl:text> </xsl:text>
    <xsl:value-of select="name()" />
    <xsl:text>=&quot;</xsl:text>
    <xsl:value-of select="." />
    <xsl:text>&quot;</xsl:text>
</xsl:template>


<xsl:template match="text()" mode="print">
    <xsl:choose>

      <xsl:when test="contains(parent::node()/@key, 'Availability')">
        <xsl:value-of select="number(current()) + 1" />
      </xsl:when>

      <xsl:otherwise>
        <xsl:value-of select="." />
      </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template match="/">
  <xsl:apply-templates mode="print" />
</xsl:template>

</xsl:stylesheet>

ซึ่งสร้างผลลัพธ์ต่อไปนี้:

http://fiddle.frameless.io/ อ้างอิง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.